Add. setopt method to multi interface.

This commit is contained in:
Alexey Melnichuk 2014-08-27 16:02:02 +05:00
parent 5695b47ed6
commit dde623513c
4 changed files with 119 additions and 0 deletions

View File

@ -312,6 +312,16 @@ function perfom() end
-- @treturn[3] error error code
function info_read() end
--- Set options.
--
-- @tparam number opt one of `curl.OPT_MULTI_XXX` constant
-- @param ... value
-- @treturn easy self
--
-- @usage
-- c:setopt(curl.OPT_MULTI_MAXCONNECTS, 10)
function setopt() end
--- End multi session.
--
function close() end

View File

@ -251,6 +251,10 @@
RelativePath="..\src\lcopteasy.h"
>
</File>
<File
RelativePath="..\src\lcoptmulti.h"
>
</File>
<File
RelativePath="..\src\lcurl.h"
>

View File

@ -108,6 +108,91 @@ static int lcurl_multi_info_read(lua_State *L){
return 1;
}
//{ OPTIONS
static int lcurl_opt_set_long_(lua_State *L, int opt){
lcurl_multi_t *p = lcurl_getmulti(L);
long val; CURLMcode code;
if(lua_isboolean(L, 2)) val = lua_toboolean(L, 2);
else{
luaL_argcheck(L, lua_type(L, 2) == LUA_TNUMBER, 2, "number or boolean expected");
val = luaL_checklong(L, 2);
}
code = curl_multi_setopt(p->curl, opt, val);
if(code != CURLM_OK){
return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_MULTI, code);
}
lua_settop(L, 1);
return 1;
}
static int lcurl_opt_set_string_array_(lua_State *L, int opt){
lcurl_multi_t *p = lcurl_getmulti(L);
CURLMcode code;
int n;
luaL_argcheck(L, lua_type(L, 2) == LUA_TTABLE, 2, "array expected");
n = lua_rawlen(L, 2);
if(n == 0){
char *val[] = {NULL};
code = curl_multi_setopt(p->curl, opt, val);
}
else{
int i;
char const* *val = malloc(sizeof(char*) * (n + 1));
if(!*val){
return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_MULTI, CURLM_OUT_OF_MEMORY);
}
for(i = 1; i <= n; ++i){
lua_rawgeti(L, 2, i);
val[i-1] = lua_tostring(L, -1);
lua_pop(L, 1);
}
val[n] = NULL;
code = curl_multi_setopt(p->curl, opt, val);
free((void*)val);
}
if(code != CURLM_OK){
return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_MULTI, code);
}
lua_settop(L, 1);
return 1;
}
#define LCURL_LNG_OPT(N, S) static int lcurl_multi_set_##N(lua_State *L){\
return lcurl_opt_set_long_(L, CURLMOPT_##N);\
}
#define LCURL_STR_ARR_OPT(N, S) static int lcurl_multi_set_##N(lua_State *L){\
return lcurl_opt_set_string_array_(L, CURLMOPT_##N);\
}
#define OPT_ENTRY(L, N, T, S) LCURL_##T##_OPT(N, S)
#include "lcoptmulti.h"
#undef OPT_ENTRY
#undef LCURL_LNG_OPT
#undef LCURL_STR_ARR_OPT
static int lcurl_multi_setopt(lua_State *L){
lcurl_multi_t *p = lcurl_getmulti(L);
int opt = luaL_checklong(L, 2);
lua_remove(L, 2);
#define OPT_ENTRY(l, N, T, S) case CURLMOPT_##N: return lcurl_multi_set_##N(L);
switch(opt){
#include "lcoptmulti.h"
}
#undef OPT_ENTRY
return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_MULTI, CURLM_UNKNOWN_OPTION);
}
//}
//}
static const struct luaL_Reg lcurl_multi_methods[] = {
@ -115,6 +200,11 @@ static const struct luaL_Reg lcurl_multi_methods[] = {
{"remove_handle", lcurl_multi_remove_handle },
{"perform", lcurl_multi_perform },
{"info_read", lcurl_multi_info_read },
{"setopt", lcurl_multi_setopt },
#define OPT_ENTRY(L, N, T, S) { "setopt_"#L, lcurl_multi_set_##N },
#include "lcoptmulti.h"
#undef OPT_ENTRY
{"close", lcurl_multi_cleanup },
{"__gc", lcurl_multi_cleanup },
@ -123,6 +213,9 @@ static const struct luaL_Reg lcurl_multi_methods[] = {
};
static const lcurl_const_t lcurl_multi_opt[] = {
#define OPT_ENTRY(L, N, T, S) { "OPT_MULTI_"#N, CURLMOPT_##N },
#include "lcoptmulti.h"
#undef OPT_ENTRY
{NULL, 0}
};

12
src/lcoptmulti.h Normal file
View File

@ -0,0 +1,12 @@
OPT_ENTRY(pipelining, PIPELINING, LNG, 0 )
OPT_ENTRY(maxconnects, MAXCONNECTS, LNG, 0 )
#if LCURL_CURL_VER_GE(7,30,0)
OPT_ENTRY(max_host_connections, MAX_HOST_CONNECTIONS, LNG, 0 )
OPT_ENTRY(max_pipeline_length, MAX_PIPELINE_LENGTH, LNG, 0 )
OPT_ENTRY(content_length_penalty_size, CONTENT_LENGTH_PENALTY_SIZE, LNG, 0 )
OPT_ENTRY(chunk_length_penalty_size, CHUNK_LENGTH_PENALTY_SIZE, LNG, 0 )
OPT_ENTRY(pipelining_site_bl, PIPELINING_SITE_BL, STR_ARR, 0 )
OPT_ENTRY(pipelining_server_bl, PIPELINING_SERVER_BL, STR_ARR, 0 )
OPT_ENTRY(max_total_connections, MAX_TOTAL_CONNECTIONS, LNG, 0 )
#endif