// part:filedata(path[, type[, name[, filename]]][, headers]) static int lcurl_mime_part_filedata(lua_State *L){ lcurl_mime_part_t *p = lcurl_getmimepart(L); const char *data = luaL_checkstring(L, 2); CURLcode ret; ret = curl_mime_filedata(p->part, data); if(ret != CURLE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } if (lua_gettop(L) > 2){ int res = lcurl_mime_part_assing_ext(L, 1, 3); if (res) return res; } lua_settop(L, 1); return 1; }
// part:subparts(mime[, type[, name]][, headers]) static int lcurl_mime_part_subparts(lua_State *L){ lcurl_mime_part_t *p = lcurl_getmimepart(L); lcurl_mime_t *mime = lcurl_getmime_at(L, 2); CURLcode ret; /* we can attach mime to only one part */ if(mime->parent){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, CURLE_BAD_FUNCTION_ARGUMENT); } /* if we already have one subpart then libcurl free it so we can not use any references to it */ lcurl_mime_part_remove_subparts(L, p, 1); ret = curl_mime_subparts(p->part, mime->mime); if(ret != CURLE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } lua_pushvalue(L, 2); p->subpart_ref = luaL_ref(L, LCURL_LUA_REGISTRY); mime->parent = p; if (lua_gettop(L) > 2){ int res = lcurl_mime_part_assing_ext(L, 1, 3); if (res) return res; } lua_settop(L, 1); return 1; }
int lcurl_url_create(lua_State *L, int error_mode){ lcurl_url_t *p; p = lutil_newudatap(L, lcurl_url_t, LCURL_URL); p->url = curl_url(); if(!p->url) return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_URL, CURLUE_OUT_OF_MEMORY); p->err_mode = error_mode; if (lua_gettop(L) > 1) { const char *url = luaL_checkstring(L, 1); unsigned int flags = 0; CURLUcode code; if (lua_gettop(L) > 2) { flags = (unsigned int)lutil_optint64(L, 2, 0); } code = curl_url_set(p->url, CURLUPART_URL, url, flags); if (code != CURLUE_OK) { return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_URL, code); } } return 1; }
// part:data(str[, type[, name[, filename]]][, headers]) static int lcurl_mime_part_data(lua_State *L){ lcurl_mime_part_t *p = lcurl_getmimepart(L); size_t len; const char *data; CURLcode ret; if(IS_FALSE(L, 2)){ data = NULL; len = 0; } else{ data = luaL_checklstring(L, 2, &len); /*string too long*/ if(len == CURL_ZERO_TERMINATED){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, CURLE_BAD_FUNCTION_ARGUMENT); } } /* curl_mime_data copies data */ ret = curl_mime_data(p->part, data, len); if(ret != CURLE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } if (lua_gettop(L) > 2){ int res = lcurl_mime_part_assing_ext(L, 1, 3); if (res) return res; } lua_settop(L, 1); return 1; }
static int lcurl_url_get(lua_State *L, CURLUPart what, CURLUcode empty) { lcurl_url_t *p = lcurl_geturl(L); CURLUcode code; char *part = NULL; unsigned int flags = 0; flags = (unsigned int)lutil_optint64(L, 2, 0); code = curl_url_get(p->url, what, &part, flags); if (code != CURLUE_OK) { if (part) { curl_free(part); part = NULL; } if (code != empty) { return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_URL, code); } } if (part == NULL) { lutil_push_null(L); } else { lua_pushstring(L, part); curl_free(part); } return 1; }
int lcurl_utils_apply_options(lua_State *L, int opt, int obj, int do_close, int error_mode, int error_type, int error_code ){ int top = lua_gettop(L); opt = lua_absindex(L, opt); obj = lua_absindex(L, obj); lua_pushnil(L); while(lua_next(L, opt) != 0){ int n; assert(lua_gettop(L) == (top + 2)); if(lua_type(L, -2) == LUA_TNUMBER){ /* [curl.OPT_URL] = "http://localhost" */ lua_pushvalue(L, -2); lua_insert(L, -2); /*Stack : opt, obj, k, k, v */ lua_pushliteral(L, "setopt"); /*Stack : opt, obj, k, k, v, "setopt" */ n = 2; } else if(lua_type(L, -2) == LUA_TSTRING){ /* url = "http://localhost" */ lua_pushliteral(L, "setopt_"); lua_pushvalue(L, -3); lua_concat(L, 2); /*Stack : opt, obj, k, v, "setopt_XXX" */ n = 1; } else{ lua_pop(L, 1); continue; } /*Stack : opt, obj, k,[ k,] v, `setoptXXX` */ lua_gettable(L, obj); /* get e["settop_XXX]*/ if(lua_isnil(L, -1)){ /* unknown option */ if(do_close) lcurl_utils_pcall_close(L, obj); lua_settop(L, top); return lcurl_fail_ex(L, error_mode, error_type, error_code); } lua_insert(L, -n-1); /*Stack : opt, obj, k, setoptXXX, [ k,] v */ lua_pushvalue(L, obj); /*Stack : opt, obj, k, setoptXXX, [ k,] v, obj */ lua_insert(L, -n-1); /*Stack : opt, obj, k, setoptXXX, obj, [ k,] v */ if(lua_pcall(L, n+1, 2, 0)){ if(do_close) lcurl_utils_pcall_close(L, obj); return lua_error(L); } if(lua_isnil(L, -2)){ if(do_close) lcurl_utils_pcall_close(L, obj); lua_settop(L, top); return 2; } /*Stack : opt, obj, k, ok, nil*/ lua_pop(L, 2); assert(lua_gettop(L) == (top+1)); } assert(lua_gettop(L) == top); return 0; }
static int lcurl_url_dup(lua_State *L) { lcurl_url_t *r = lcurl_geturl(L); lcurl_url_t *p = lutil_newudatap(L, lcurl_url_t, LCURL_URL); p->url = curl_url_dup(r->url); if (!p->url) return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_URL, CURLUE_OUT_OF_MEMORY); p->err_mode = r->err_mode; return 1; }
static int lcurl_opt_set_long_(lua_State *L, int opt){ lcurl_share_t *p = lcurl_getshare(L); long val; CURLSHcode 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_share_setopt(p->curl, opt, val); if(code != CURLSHE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_SHARE, code); } lua_settop(L, 1); return 1; }
int lcurl_mime_part_create(lua_State *L, int error_mode){ //! @todo make this function as method of mime handle lcurl_mime_t *m = lcurl_getmime(L); lcurl_mime_part_t *p = lutil_newudatap(L, lcurl_mime_part_t, LCURL_MIME_PART); p->part = curl_mime_addpart(m->mime); //! @todo return more accurate error category/code if(!p->part) return lcurl_fail_ex(L, error_mode, LCURL_ERROR_EASY, CURLE_FAILED_INIT); p->rbuffer.ref = p->rd.cb_ref = p->rd.ud_ref = LUA_NOREF; p->err_mode = error_mode; p->subpart_ref = p->headers_ref = LUA_NOREF; p->parent = m; return 1; }
//{ int lcurl_share_create(lua_State *L, int error_mode){ lcurl_share_t *p; lua_settop(L, 1); p = lutil_newudatap(L, lcurl_share_t, LCURL_SHARE); p->curl = curl_share_init(); p->err_mode = error_mode; if(!p->curl) return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_SHARE, CURLSHE_NOMEM); if(lua_type(L, 1) == LUA_TTABLE){ int ret = lcurl_utils_apply_options(L, 1, 2, 1, p->err_mode, LCURL_ERROR_SHARE, CURLSHE_BAD_OPTION); if(ret) return ret; assert(lua_gettop(L) == 2); } return 1; }
static int lcurl_url_set(lua_State *L, CURLUPart what){ lcurl_url_t *p = lcurl_geturl(L); CURLUcode code; const char *part; unsigned int flags = 0; luaL_argcheck(L, lua_type(L, 2) == LUA_TSTRING || lutil_is_null(L, 2), 2, "string expected"); part = lua_tostring(L, 2); flags = (unsigned int)lutil_optint64(L, 3, 0); code = curl_url_set(p->url, what, part, flags); if (code != CURLUE_OK) { return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_URL, code); } lua_settop(L, 1); return 1; }
// part:encoder(t) static int lcurl_mime_part_encoder(lua_State *L){ lcurl_mime_part_t *p = lcurl_getmimepart(L); const char *mime_encode; CURLcode ret; if(IS_FALSE(L, 2)){ mime_encode = NULL; } else{ mime_encode = luaL_checkstring(L, 2); } ret = curl_mime_encoder(p->part, mime_encode); if(ret != CURLE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } lua_settop(L, 1); return 1; }
int lcurl_mime_create(lua_State *L, int error_mode){ //! @todo make this function as method of easy handle lcurl_easy_t *e = lcurl_geteasy(L); lcurl_mime_t *p = lutil_newudatap(L, lcurl_mime_t, LCURL_MIME); p->mime = curl_mime_init(e->curl); //! @todo return more accurate error category/code if(!p->mime) return lcurl_fail_ex(L, error_mode, LCURL_ERROR_EASY, CURLE_FAILED_INIT); p->storage = lcurl_storage_init(L); p->err_mode = error_mode; p->parts = p->parent = NULL; /* weak reference from mime to easy handle */ lua_pushvalue(L, 1); lua_rawsetp(L, LCURL_MIME_EASY, (void*)p); return 1; }
// part:headers(t) static int lcurl_mime_part_headers(lua_State *L){ lcurl_mime_part_t *p = lcurl_getmimepart(L); struct curl_slist *list; CURLcode ret; if(IS_FALSE(L, 2)){ list = NULL; } else{ list = lcurl_util_to_slist(L, 2); luaL_argcheck(L, list || IS_TABLE(L, 2), 2, "array or null expected"); } ret = curl_mime_headers(p->part, list, 1); if(ret != CURLE_OK){ if(list) curl_slist_free_all(list); return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } lua_settop(L, 1); return 1; }
static int lcurl_share_setopt(lua_State *L){ lcurl_share_t *p = lcurl_getshare(L); int opt; luaL_checkany(L, 2); if(lua_type(L, 2) == LUA_TTABLE){ int ret = lcurl_utils_apply_options(L, 2, 1, 0, p->err_mode, LCURL_ERROR_SHARE, CURLSHE_BAD_OPTION); if(ret) return ret; lua_settop(L, 1); return 1; } opt = luaL_checklong(L, 2); lua_remove(L, 2); #define OPT_ENTRY(l, N, T, S) case CURLSHOPT_##N: return lcurl_share_set_##N(L); switch(opt){ #include "lcoptshare.h" } #undef OPT_ENTRY return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_SHARE, CURLSHE_BAD_OPTION); }
static int lcurl_url_to_s(lua_State *L) { lcurl_url_t *p = lcurl_geturl(L); char *part = NULL; CURLUcode code = curl_url_get(p->url, CURLUPART_URL, &part, 0); if (code != CURLUE_OK) { if (part) { curl_free(part); } return lcurl_fail_ex(L, LCURL_ERROR_RAISE, LCURL_ERROR_URL, code); } if (part == NULL) { lua_pushliteral(L, ""); } else { lua_pushstring(L, part); curl_free(part); } return 1; }
static int lcurl_mime_part_assing_ext(lua_State *L, int part, int i){ #define UNSET_VALUE (const char*)-1 const char *mime_type = NULL, *mime_name = NULL, *mime_fname = NULL; int headers = 0; CURLcode ret; lcurl_mime_part_t *p = lcurl_getmimepart_at(L, part); if(IS_TABLE(L, i)) headers = i; else if (IS_OPTSTR(L, i)) { mime_type = IS_FALSE(L, i) ? UNSET_VALUE : lua_tostring(L, i); if(IS_TABLE(L, i+1)) headers = i+1; else if(IS_OPTSTR(L, i+1)){ mime_name = IS_FALSE(L, i+1) ? UNSET_VALUE : lua_tostring(L, i+1); if(IS_TABLE(L, i+2)) headers = i+2; else if(IS_OPTSTR(L, i+2)){ mime_fname = IS_FALSE(L, i+2) ? UNSET_VALUE : lua_tostring(L, i+2); if(IS_TABLE(L, i+3)) headers = i+3; else if(IS_FALSE(L, i+3)){ headers = -1; } } } } if(mime_type){ ret = curl_mime_type(p->part, mime_type == UNSET_VALUE ? NULL : mime_type); if(ret != CURLE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } } if(mime_name){ ret = curl_mime_name(p->part, mime_name == UNSET_VALUE ? NULL : mime_name); if(ret != CURLE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } } if(mime_fname){ ret = curl_mime_filename(p->part, mime_fname == UNSET_VALUE ? NULL : mime_fname); if(ret != CURLE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } } if(headers){ if(-1 == headers){ ret = curl_mime_headers(p->part, NULL, 0); if(ret != CURLE_OK){ return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_EASY, ret); } } else return lcurl_mime_part_assing_table(L, part, headers); } return 0; #undef UNSET_VALUE }
int lcurl_fail(lua_State *L, int error_type, int code){ return lcurl_fail_ex(L, LCURL_ERROR_RETURN, error_type, code); }