| /* | |
| Licensed to the Apache Software Foundation (ASF) under one | |
| or more contributor license agreements. See the NOTICE file | |
| distributed with this work for additional information | |
| regarding copyright ownership. The ASF licenses this file | |
| to you under the Apache License, Version 2.0 (the | |
| "License"); you may not use this file except in compliance | |
| with the License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| */ | |
| #pragma once | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <inttypes.h> | |
| extern "C" { | |
| #include "lua.h" | |
| #include "lualib.h" | |
| #include "lauxlib.h" | |
| } // extern "C" | |
| #include <ts/ts.h> | |
| #include <ts/remap.h> | |
| #include "ts_lua_coroutine.h" | |
| #define TS_LUA_FUNCTION_REMAP "do_remap" | |
| #define TS_LUA_FUNCTION_OS_RESPONSE "do_os_response" | |
| #define TS_LUA_FUNCTION_CACHE_LOOKUP_COMPLETE "do_cache_lookup_complete" | |
| #define TS_LUA_FUNCTION_SEND_REQUEST "do_send_request" | |
| #define TS_LUA_FUNCTION_READ_RESPONSE "do_read_response" | |
| #define TS_LUA_FUNCTION_SEND_RESPONSE "do_send_response" | |
| #define TS_LUA_FUNCTION_READ_REQUEST "do_read_request" | |
| #define TS_LUA_FUNCTION_TXN_START "do_txn_start" | |
| #define TS_LUA_FUNCTION_PRE_REMAP "do_pre_remap" | |
| #define TS_LUA_FUNCTION_POST_REMAP "do_post_remap" | |
| #define TS_LUA_FUNCTION_OS_DNS "do_os_dns" | |
| #define TS_LUA_FUNCTION_READ_CACHE "do_read_cache" | |
| #define TS_LUA_FUNCTION_TXN_CLOSE "do_txn_close" | |
| #define TS_LUA_FUNCTION_G_SEND_REQUEST "do_global_send_request" | |
| #define TS_LUA_FUNCTION_G_READ_REQUEST "do_global_read_request" | |
| #define TS_LUA_FUNCTION_G_SEND_RESPONSE "do_global_send_response" | |
| #define TS_LUA_FUNCTION_G_READ_RESPONSE "do_global_read_response" | |
| #define TS_LUA_FUNCTION_G_CACHE_LOOKUP_COMPLETE "do_global_cache_lookup_complete" | |
| #define TS_LUA_FUNCTION_G_TXN_START "do_global_txn_start" | |
| #define TS_LUA_FUNCTION_G_PRE_REMAP "do_global_pre_remap" | |
| #define TS_LUA_FUNCTION_G_POST_REMAP "do_global_post_remap" | |
| #define TS_LUA_FUNCTION_G_OS_DNS "do_global_os_dns" | |
| #define TS_LUA_FUNCTION_G_READ_CACHE "do_global_read_cache" | |
| #define TS_LUA_FUNCTION_G_TXN_CLOSE "do_global_txn_close" | |
| // TLS hooks can only be global | |
| #define TS_LUA_FUNCTION_G_VCONN_START "do_global_vconn_start" | |
| // Lifecycle hooks | |
| #define TS_LUA_FUNCTION_G_SHUT_DOWN "__shutdown__" | |
| #define TS_LUA_DEBUG_TAG "ts_lua" | |
| #define TS_LUA_EVENT_COROUTINE_CONT 20000 | |
| #define TS_LUA_MAX_SCRIPT_FNAME_LENGTH 1024 | |
| #define TS_LUA_MAX_CONFIG_VARS_COUNT 256 | |
| #define TS_LUA_MAX_SHARED_DICT_NAME_LENGTH 128 | |
| #define TS_LUA_MAX_SHARED_DICT_COUNT 32 | |
| #define TS_LUA_MAX_URL_LENGTH 32768 | |
| #define TS_LUA_MAX_OVEC_SIZE (3 * 32) | |
| #define TS_LUA_MAX_RESIDENT_PCRE2 64 | |
| #define TS_LUA_MAX_STR_LENGTH 32768 | |
| #define TS_LUA_MIN_ALIGN sizeof(void *) | |
| #define TS_LUA_MEM_ALIGN(size) (((size) + ((TS_LUA_MIN_ALIGN) - 1)) & ~((TS_LUA_MIN_ALIGN) - 1)) | |
| #define TS_LUA_ALIGN_COUNT(size) (size / TS_LUA_MIN_ALIGN) | |
| #define TS_LUA_MAKE_VAR_ITEM(X) \ | |
| { \ | |
| X, #X \ | |
| } | |
| /* for http config or cntl var */ | |
| struct ts_lua_var_item { | |
| int nvar; | |
| char const *svar; | |
| }; | |
| struct ts_lua_instance_conf { | |
| char const *content; | |
| char script[TS_LUA_MAX_SCRIPT_FNAME_LENGTH]; | |
| void *conf_vars[TS_LUA_MAX_CONFIG_VARS_COUNT]; | |
| unsigned int _first : 1; // create current instance for 1st ts_lua_main_ctx | |
| unsigned int _last : 1; // create current instance for the last ts_lua_main_ctx | |
| int remap; | |
| int states; | |
| int ljgc; | |
| int ref_count; | |
| int init_func; | |
| }; | |
| /* lua state for vconn */ | |
| struct ts_lua_vconn_ctx { | |
| int ref; | |
| ts_lua_main_ctx *mctx; | |
| lua_State *lua; | |
| TSVConn vconn; | |
| ts_lua_instance_conf *instance_conf; | |
| }; | |
| /* lua state for http request */ | |
| struct ts_lua_http_ctx { | |
| ts_lua_cont_info cinfo; | |
| TSHttpTxn txnp; | |
| TSMBuffer client_request_bufp; | |
| TSMLoc client_request_hdrp; | |
| TSMLoc client_request_url; | |
| TSMBuffer server_request_bufp; | |
| TSMLoc server_request_hdrp; | |
| TSMLoc server_request_url; | |
| TSMBuffer server_response_bufp; | |
| TSMLoc server_response_hdrp; | |
| TSMBuffer client_response_bufp; | |
| TSMLoc client_response_hdrp; | |
| TSMBuffer cached_response_bufp; | |
| TSMLoc cached_response_hdrp; | |
| ts_lua_instance_conf *instance_conf; | |
| int has_hook; | |
| int from_remap; | |
| TSRemapRequestInfo *rri; | |
| }; | |
| struct ts_lua_io_handle { | |
| TSVIO vio; | |
| TSIOBuffer buffer; | |
| TSIOBufferReader reader; | |
| }; | |
| struct ts_lua_http_transform_ctx { | |
| ts_lua_cont_info cinfo; | |
| ts_lua_io_handle output; | |
| ts_lua_io_handle reserved; | |
| ts_lua_http_ctx *hctx; | |
| int64_t upstream_bytes; | |
| int64_t upstream_watermark_bytes; | |
| int64_t downstream_bytes; | |
| int64_t total; | |
| }; | |
| struct ts_lua_http_intercept_ctx { | |
| ts_lua_cont_info cinfo; | |
| ts_lua_io_handle input; | |
| ts_lua_io_handle output; | |
| TSVConn net_vc; | |
| ts_lua_http_ctx *hctx; | |
| int64_t to_flush; | |
| unsigned int reuse : 1; | |
| unsigned int recv_complete : 1; | |
| unsigned int send_complete : 1; | |
| unsigned int all_ready : 1; | |
| }; | |
| #define TS_LUA_RELEASE_IO_HANDLE(ih) \ | |
| do { \ | |
| if (ih->reader) { \ | |
| TSIOBufferReaderFree(ih->reader); \ | |
| ih->reader = nullptr; \ | |
| } \ | |
| if (ih->buffer) { \ | |
| TSIOBufferDestroy(ih->buffer); \ | |
| ih->buffer = nullptr; \ | |
| } \ | |
| } while (0) | |
| #ifndef ATS_UNUSED | |
| #define ATS_UNUSED __attribute__((unused)) | |
| #endif | |
| namespace ts_lua_ns | |
| { | |
| extern DbgCtl dbg_ctl; | |
| } | |
| using namespace ts_lua_ns; |