struct task* create_task(downloader *dler, const char *url, const char *fullname) { struct task *task = (struct task*)malloc(sizeof(struct task)); task->dler = dler; task->next = dler->tasks; dler->tasks = task; task->head_request = http_request_new(task); task->name = strdup(fullname); task->cur_size = 0; task->blocks = NULL; task->start_time = uv_now(dler->mainloop); task->consumed_time = 0; task->last_step_time = task->start_time; task->last_step_size = task->cur_size; if (strncmp(url, "http://", 7) == 0) { task->url = http_parse_url(url); } else { int len = strlen(url); char *new_url = (char*)calloc(1, len + 7 + 1); memcpy(new_url, "http://", 7); memcpy(new_url + 7, url, len); task->url = http_parse_url(new_url); free(new_url); } if (task->url == NULL) { printf("parse url failed\n"); exit(-1); } /* change host to a zero-terminated string for uv_getaddrinfo() */ uv_buf_t buf = http_url_get_field(task->url, UF_HOST); char *host = (char*)calloc(1, buf.len + 1); memcpy(host, buf.base, buf.len); struct addrinfo hints; hints.ai_family = PF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = 0; uv_getaddrinfo_t *getaddrinfo = (uv_getaddrinfo_t*)malloc(sizeof(uv_getaddrinfo_t)); getaddrinfo->data = task; uv_getaddrinfo(dler->mainloop, getaddrinfo, on_resolved, host, NULL, &hints); free(host); return task; }
char * ICACHE_FLASH_ATTR http_url_get_query(http_connection *c){ return http_url_get_field(c,UF_QUERY); }
char * ICACHE_FLASH_ATTR http_url_get_path(http_connection *c){ return http_url_get_field(c,UF_PATH); }
char * ICACHE_FLASH_ATTR http_url_get_host(http_connection *c){ return http_url_get_field(c,UF_HOST); }