Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 34 additions & 47 deletions src/lceasy.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,6 @@ int lcurl_easy_create(lua_State *L, int error_mode){
p->multi = NULL;
#if LCURL_CURL_VER_GE(7,56,0)
p->mime = NULL;
#endif
#if LCURL_CURL_VER_GE(7,63,0)
p->url = NULL;
#endif
p->storage = lcurl_storage_init(L);
p->wr.cb_ref = p->wr.ud_ref = LUA_NOREF;
Expand Down Expand Up @@ -130,46 +127,18 @@ static int lcurl_easy_to_s(lua_State *L){
return 1;
}

static int lcurl_easy_cleanup(lua_State *L){
lcurl_easy_t *p = lcurl_geteasy(L);
static int lcurl_easy_cleanup_storage(lua_State *L, lcurl_easy_t *p){
int i;

if(p->multi){
LCURL_UNUSED_VAR CURLMcode code = lcurl__multi_remove_handle(L, p->multi, p);

//! @todo what I can do if I can not remove it???
}

if(p->curl){
lua_State *curL;

// In my tests when I cleanup some easy handle.
// timerfunction called only for single multi handle.
// Also may be this function may call `close` callback
// for `curl_mimepart` structure.
curL = p->L; lcurl__easy_assign_lua(L, p, L, 1);
curl_easy_cleanup(p->curl);
#ifndef LCURL_RESET_NULL_LUA
if(curL != NULL)
#endif
lcurl__easy_assign_lua(L, p, curL, 1);

p->curl = NULL;
if(p->storage != LUA_NOREF){
p->storage = lcurl_storage_free(L, p->storage);
}

p->post = NULL;
#if LCURL_CURL_VER_GE(7,56,0)
p->mime = NULL;
#endif

#if LCURL_CURL_VER_GE(7,63,0)
p->url = NULL;
#endif

if(p->storage != LUA_NOREF){
p->storage = lcurl_storage_free(L, p->storage);
}

luaL_unref(L, LCURL_LUA_REGISTRY, p->wr.cb_ref);
luaL_unref(L, LCURL_LUA_REGISTRY, p->wr.ud_ref);
luaL_unref(L, LCURL_LUA_REGISTRY, p->rd.cb_ref);
Expand Down Expand Up @@ -221,8 +190,37 @@ static int lcurl_easy_cleanup(lua_State *L){
for(i = 0; i < LCURL_LIST_COUNT; ++i){
p->lists[i] = LUA_NOREF;
}
}

static int lcurl_easy_cleanup(lua_State *L){
lcurl_easy_t *p = lcurl_geteasy(L);
lua_settop(L, 1);

if(p->multi){
LCURL_UNUSED_VAR CURLMcode code = lcurl__multi_remove_handle(L, p->multi, p);

//! @todo what I can do if I can not remove it???
}

if(p->curl){
lua_State *curL;

// In my tests when I cleanup some easy handle.
// timerfunction called only for single multi handle.
// Also may be this function may call `close` callback
// for `curl_mimepart` structure.
curL = p->L; lcurl__easy_assign_lua(L, p, L, 1);
curl_easy_cleanup(p->curl);
#ifndef LCURL_RESET_NULL_LUA
if(curL != NULL)
#endif
lcurl__easy_assign_lua(L, p, curL, 1);

p->curl = NULL;
}

lcurl_easy_cleanup_storage(L, p);

lua_pushnil(L);
lua_rawset(L, LCURL_USERVALUES);

Expand Down Expand Up @@ -305,15 +303,8 @@ static int lcurl_easy_reset(lua_State *L){
curl_easy_reset(p->curl);
lua_settop(L, 1);

if(p->storage != LUA_NOREF){
int i;
for (i = 0; i < LCURL_LIST_COUNT; ++i) {
p->lists[i] = LUA_NOREF;
}
lcurl_storage_free(L, p->storage);
p->storage = lcurl_storage_init(L);
lua_settop(L, 1);
}
lcurl_easy_cleanup_storage(L, p);
p->storage = lcurl_storage_init(L);

return 1;
}
Expand Down Expand Up @@ -621,8 +612,6 @@ static int lcurl_easy_set_CURLU(lua_State *L) {

lcurl_storage_preserve_iv(L, p->storage, CURLOPT_CURLU, 2);

p->url = url;

lua_settop(L, 1);
return 1;
}
Expand Down Expand Up @@ -1030,8 +1019,6 @@ static int lcurl_easy_unset_CURLU(lua_State *L) {

lcurl_storage_remove_i(L, p->storage, CURLOPT_CURLU);

p->url = NULL;

lua_settop(L, 1);
return 1;
}
Expand Down
4 changes: 0 additions & 4 deletions src/lceasy.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,6 @@ typedef struct lcurl_easy_tag{
lcurl_mime_t *mime;
#endif

#if LCURL_CURL_VER_GE(7,63,0)
lcurl_url_t *url;
#endif

CURL *curl;
int storage;
int lists[LCURL_LIST_COUNT];
Expand Down
2 changes: 1 addition & 1 deletion src/lcutils.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ int lcurl_storage_free(lua_State *L, int storage){
lua_pop(L, 1);
}
}
lua_pop(L, 1);
luaL_unref(L, LCURL_LUA_REGISTRY, storage);
lua_pop(L, 2);
return LUA_NOREF;
}

Expand Down
26 changes: 23 additions & 3 deletions test/test_easy.lua
Original file line number Diff line number Diff line change
Expand Up @@ -889,16 +889,16 @@ function test_reset()
do
local form = curl.form()
e = curl.easy{httppost = form}
pfrom = weak_ptr(form)
pform = weak_ptr(form)
end

gc_collect()
assert(pfrom.value)
assert(pform.value)

assert_equal(e, e:reset())

gc_collect()
assert(not pfrom.value)
assert(not pform.value)
end

end
Expand Down Expand Up @@ -1027,6 +1027,8 @@ end

local _ENV = TEST_CASE'unset_callback_ctx' if ENABLE then

local HSTS = curl.version_info().features.HSTS

local c

function setup()
Expand Down Expand Up @@ -1057,6 +1059,19 @@ local function test_cb(name)

gc_collect()
assert_nil(pctx.value)

do local ctx = {}
pctx = weak_ptr(ctx)
assert(set(c, function() end, ctx))
end

gc_collect()
assert_table(pctx.value)

c:reset()

gc_collect()
assert_nil(pctx.value)
end

function test_read() test_cb('readfunction') end
Expand All @@ -1069,6 +1084,11 @@ function test_fnmatch() test_cb('fnmatch_function') end
function test_chunk_bgn() test_cb('chunk_bgn_function') end
function test_chunk_end() test_cb('chunk_end_function') end

if curl.OPT_HSTSREADFUNCTION and HSTS then
function test_hstsreadfunction() test_cb('hstsreadfunction') end
function test_hstswritefunction() test_cb('hstswritefunction') end
end

end

local _ENV = TEST_CASE'set_slist' if ENABLE then
Expand Down
53 changes: 53 additions & 0 deletions test/test_mime.lua
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,27 @@ function test_mimepost_does_not_ref_to_easy()
assert_nil(peasy.value)
end

function test_cleanup_on_easy_reset()

local mime do
mime = weak_ptr(easy:mime())
easy:setopt_mimepost(mime.value)
end

gc_collect()

assert_not_nil(mime.value)

easy:reset()

gc_collect(10)

assert_nil(mime.value)

easy:setopt{url = GET_URL, writefunction = function() end}
easy:perform()
end

end

local _ENV = TEST_CASE'mime basic' if not curl.OPT_MIMEPOST then
Expand Down Expand Up @@ -573,6 +594,38 @@ function test_pass_args()
assert_match('Content%-Transfer%-Encoding:%s*base64', info)
end

local function easy_dump_mime(easy, mime, url)
assert(mime:addpart{
data = 'hello';
encoder = 'base64';
name = 'test';
filename = 'test.html';
type = 'test/html';
headers = {
'X-Custom-Header: hello';
}
})

easy:setopt{
mimepost = mime;
}

assert(easy:setopt{
url = GET_URL;
customrequest = "GET";

writefunction = function()end;
})

if not ok then return nil, err end

ok, err = easy:perform()

if not ok then return nil, err end

return table.concat(buffer)
end

end

RUN()