Exemple #1
2
// 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;
}
Exemple #2
0
// 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;
}
Exemple #3
0
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;
}
Exemple #4
0
// 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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}
Exemple #7
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;
}
Exemple #8
0
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;
}
Exemple #9
0
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;
}
Exemple #10
0
//{
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;
}
Exemple #11
0
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;
}
Exemple #12
0
// 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;
}
Exemple #13
0
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;
}
Exemple #14
0
// 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;
}
Exemple #15
0
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);
}
Exemple #16
0
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;
}
Exemple #17
0
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
}
Exemple #18
0
int lcurl_fail(lua_State *L, int error_type, int code){
  return lcurl_fail_ex(L, LCURL_ERROR_RETURN, error_type, code);
}