mirror of
https://github.com/wg/wrk
synced 2025-01-23 04:02:59 +08:00
add CHANGES file and simplify script init
This commit is contained in:
parent
db6da47fe3
commit
93348e2814
4
CHANGES
Normal file
4
CHANGES
Normal file
@ -0,0 +1,4 @@
|
||||
master
|
||||
|
||||
* The wrk global variable is the only global defined by default.
|
||||
* wrk.init() calls the global init(), remove calls to wrk.init().
|
13
README
13
README
@ -50,14 +50,15 @@ Scripting
|
||||
wrk.format returns a HTTP request string containing the passed
|
||||
parameters merged with values from the wrk table.
|
||||
|
||||
global init -- function called when the thread is initialized
|
||||
global request -- function returning the HTTP message for each request
|
||||
global response -- optional function called with HTTP response data
|
||||
global done -- optional function called with results of run
|
||||
The following globals are optional, and if defined must be functions:
|
||||
|
||||
global init -- called when the thread is initialized
|
||||
global request -- returning the HTTP message for each request
|
||||
global response -- called with HTTP response data
|
||||
global done -- called with results of run
|
||||
|
||||
The init() function receives any extra command line arguments for the
|
||||
script. Script arguments must be separated from wrk arguments with "--"
|
||||
and scripts that override init() but not request() must call wrk.init()
|
||||
script which must be separated from wrk arguments with "--".
|
||||
|
||||
The done() function receives a table containing result data, and two
|
||||
statistics objects representing the sampled per-request latency and
|
||||
|
@ -1,8 +1,6 @@
|
||||
-- example script demonstrating HTTP pipelining
|
||||
|
||||
init = function(args)
|
||||
wrk.init(args)
|
||||
|
||||
local r = {}
|
||||
r[1] = wrk.format(nil, "/?foo")
|
||||
r[2] = wrk.format(nil, "/?bar")
|
||||
|
40
src/script.c
40
src/script.c
@ -65,22 +65,30 @@ void script_init(lua_State *L, char *script, int argc, char **argv) {
|
||||
fprintf(stderr, "%s: %s\n", script, cause);
|
||||
}
|
||||
|
||||
lua_getglobal(L, "init");
|
||||
lua_getglobal(L, "wrk");
|
||||
lua_getfield(L, -1, "init");
|
||||
lua_newtable(L);
|
||||
for (int i = 0; i < argc; i++) {
|
||||
lua_pushstring(L, argv[i]);
|
||||
lua_rawseti(L, 2, i);
|
||||
lua_rawseti(L, -2, i);
|
||||
}
|
||||
lua_call(L, 1, 0);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
void script_request(lua_State *L, char **buf, size_t *len) {
|
||||
int pop = 1;
|
||||
lua_getglobal(L, "request");
|
||||
if (!lua_isfunction(L, -1)) {
|
||||
lua_getglobal(L, "wrk");
|
||||
lua_getfield(L, -1, "request");
|
||||
pop += 2;
|
||||
}
|
||||
lua_call(L, 0, 1);
|
||||
const char *str = lua_tolstring(L, 1, len);
|
||||
const char *str = lua_tolstring(L, -1, len);
|
||||
*buf = realloc(*buf, *len);
|
||||
memcpy(*buf, str, *len);
|
||||
lua_pop(L, 1);
|
||||
lua_pop(L, pop);
|
||||
}
|
||||
|
||||
void script_response(lua_State *L, int status, buffer *headers, buffer *body) {
|
||||
@ -101,27 +109,23 @@ void script_response(lua_State *L, int status, buffer *headers, buffer *body) {
|
||||
buffer_reset(body);
|
||||
}
|
||||
|
||||
bool script_is_function(lua_State *L, char *name) {
|
||||
lua_getglobal(L, name);
|
||||
bool is_function = lua_isfunction(L, -1);
|
||||
lua_pop(L, 1);
|
||||
return is_function;
|
||||
}
|
||||
|
||||
bool script_is_static(lua_State *L) {
|
||||
lua_getglobal(L, "wrk");
|
||||
lua_getfield(L, 1, "request");
|
||||
lua_getglobal(L, "request");
|
||||
bool is_static = lua_equal(L, 2, 3);
|
||||
lua_pop(L, 3);
|
||||
return is_static;
|
||||
return !script_is_function(L, "request");
|
||||
}
|
||||
|
||||
bool script_want_response(lua_State *L) {
|
||||
lua_getglobal(L, "response");
|
||||
bool defined = lua_type(L, 1) == LUA_TFUNCTION;
|
||||
lua_pop(L, 1);
|
||||
return defined;
|
||||
return script_is_function(L, "response");
|
||||
}
|
||||
|
||||
bool script_has_done(lua_State *L) {
|
||||
lua_getglobal(L, "done");
|
||||
bool defined = lua_type(L, 1) == LUA_TFUNCTION;
|
||||
lua_pop(L, 1);
|
||||
return defined;
|
||||
return script_is_function(L, "done");
|
||||
}
|
||||
|
||||
void script_header_done(lua_State *L, luaL_Buffer *buffer) {
|
||||
|
17
src/wrk.lua
17
src/wrk.lua
@ -42,16 +42,15 @@ function wrk.init(args)
|
||||
|
||||
wrk.headers["Host"] = host
|
||||
end
|
||||
req = wrk.format()
|
||||
end
|
||||
|
||||
function wrk.request()
|
||||
return req
|
||||
end
|
||||
if type(init) == "function" then
|
||||
init(args)
|
||||
end
|
||||
|
||||
init = wrk.init
|
||||
request = wrk.request
|
||||
response = nil
|
||||
done = nil
|
||||
local req = wrk.format()
|
||||
wrk.request = function()
|
||||
return req
|
||||
end
|
||||
end
|
||||
|
||||
return wrk
|
||||
|
Loading…
Reference in New Issue
Block a user