void url_coder::decode(const char* str) { ACL_ARGV* tokens = acl_argv_split(str, "&"); ACL_ITER iter; acl_foreach(iter, tokens) { char* name = (char*) iter.data; char* value = strchr(name, '='); if (value == NULL || *(value + 1) == 0) continue; *value++ = 0; name = acl_url_decode(name); value = acl_url_decode(value); URL_NV* param = (URL_NV*) acl_mymalloc(sizeof(URL_NV)); param->name = name; param->value = value; params_.push_back(param); }
void http_mime_node::load_param(const char* path) { ifstream in; if (in.open_read(path) == false) { logger_error("open file %s error(%s)", path, last_serror()); return; } off_t begin = get_bodyBegin(); off_t end = get_bodyEnd(); if (begin < 0 || end < 0 || begin >= end) { logger_error("invalid file offset, begin: %d, end: %d", (int) begin, (int) end); return; } if (in.fseek(begin, SEEK_SET) == -1) { logger_error("fseek file %s error(%s), begin: %d", path, last_serror(), (int) begin); return; } size_t len = end - begin; char* buf = (char*) acl_mymalloc(len + 1); if (in.read(buf, len) == -1) { acl_myfree(buf); logger_error("read file %s error(%s)", path, last_serror()); return; } buf[len] = 0; char* ptr = buf + len - 1; while (ptr >= buf) { if (*ptr == '\r' || *ptr == '\n' || *ptr == ' ' || *ptr == '\t') { *ptr-- = 0; continue; } break; } if (*buf == 0) { acl_myfree(buf); return; } char* value = acl_url_decode(buf); if (value == NULL) value = buf; else acl_myfree(buf); const char* fromCharset = get_charset(); const char* toCharset = get_toCharset(); if (fromCharset && *fromCharset && toCharset && *toCharset && strcasecmp(fromCharset, toCharset)) { charset_conv conv; string tmp; if (conv.convert(fromCharset, toCharset, value, strlen(value), &tmp) == true) { param_value_ = acl_mystrdup(tmp.c_str()); acl_myfree(value); } else param_value_ = value; } else param_value_ = value; }