From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f44.google.com ([209.85.128.44]) by ewsd; Sat Mar 21 15:17:09 EDT 2020 Received: by mail-wm1-f44.google.com with SMTP id z18so1250165wmk.2 for <9front@9front.org>; Sat, 21 Mar 2020 12:17:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:message-id:date:to:subject:mime-version; bh=5zOVrO2lIoNGqdY2seO2TR0aZCyAIj6zEh1KGYHzMq4=; b=FtKngEinwNCbfafAI0FgupFt0NxT1/jkyvwqZdVC1fwvghdCIFUgh2g4wXdY8FtmsM eOnTjOByYAKa6VxdL/RnFzpQIVwxIA1sLzsccOX/wH9a8ZpilmcuiTmILYkMXkN05C+l mH06+At2bxURVzoD2AzSDK4bXv5Sighy3L9sqoKSXcfXrIOGxsSZDj2RLmOGDh4gu+gm QIlvU7KKWc20rHu9vEsb3+7jCHiOBjrgOcuzsBQEzp3+nPGByneV8Pt+AMzh5cz6RUyz uvUEa/CmEkzubtWHgC30V/vyUUyl0HW99Ihy1Um0IbnMu9D3cXALYCJcKjF5Oi7/nbIn +v/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:date:to:subject:mime-version; bh=5zOVrO2lIoNGqdY2seO2TR0aZCyAIj6zEh1KGYHzMq4=; b=RsffE1mZWHJgyuRulWP1xjcibRmup2FPpyBrJ+IAXxw/bmJh1yvyqN2s7+ddWqZi6n /7d2MHFjKOrI+GbSqs4pwmOEhF55ZEFbxHvnRVQPVM+mvrptWYstKkLwHz+W0bMCdxRS GNrG6WfP0R3j+2MdpOkXSGDkS6b/Ud9a/LYZQ0n39TQuRq39EEh7BvwSOvTQm6DwjgkP +pbKrD0bZAMrEt4NxHemjzDwXAb2+LmE+KKq5ASt8KEjOzoj3bQsESFsmFRYzuzRqY+J b7dAixHH9kdjngtw1SlE1qdpzLCt3tVFhzRi1CAVR0zT7WHVH8aq6FYje5AkfgnFEd3N 2HKw== X-Gm-Message-State: ANhLgQ0PHRXBASDcPHNmAUdS+kSMttXDsuJ97GH6FhofNeVjQ4bFfj+K t81RZDlZwmHK3rz/zqrI1GLZDvsy X-Google-Smtp-Source: ADFU+vvCFl0kEL564kJqK78OiaEPL1voe6jB7sfDx176Z98AO2UZrTjHaGQX55gW1EJdPH7rUw6NBQ== X-Received: by 2002:a7b:c542:: with SMTP id j2mr17758215wmk.39.1584818226262; Sat, 21 Mar 2020 12:17:06 -0700 (PDT) Return-Path: Received: from hades (lfbn-idf1-1-352-97.w86-195.abo.wanadoo.fr. [86.195.7.97]) by smtp.gmail.com with ESMTPSA id r11sm5947647wrn.24.2020.03.21.12.17.05 for <9front@9front.org> (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 21 Mar 2020 12:17:05 -0700 (PDT) From: telephil9@gmail.com X-Google-Original-From: pme@gmail.com Message-ID: <6F9D014DB661B27EC9A9E01FC38B1485@gmail.com> Date: Sat, 21 Mar 2020 20:17:04 +0100 To: 9front@9front.org Subject: [PATCH] netsurf: webfs POST implementation MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="upas-shujvxpfgbzkmgsfxryfydcpvu" List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: browser component This is a multi-part message in MIME format. --upas-shujvxpfgbzkmgsfxryfydcpvu Content-Disposition: inline Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Hi, Here is a patch to implement POST requests in netsurf webfs fetcher. I could not test multipart POST requests yet as I could not find a site that uses this encoding method. Also, the webfs clients exhaustion issue should now be fixed. Regards, Philippe --upas-shujvxpfgbzkmgsfxryfydcpvu Content-Disposition: inline Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit --- /mnt/git/object/25c368f547f3c9f3aff3006980e871b2dedcc92e/tree/content/webfs.c Wed Feb 12 23:12:26 2020 +++ content/webfs.c Sat Mar 21 19:58:06 2020 @@ -10,6 +10,7 @@ #include "utils/nsurl.h" #include "content/llcache.h" +#include "content/fetch.h" #include "netsurf/misc.h" #include "desktop/gui_internal.h" #include "libwapcaplet/libwapcaplet.h" @@ -35,7 +36,8 @@ struct webfs_data { data_state state; char *err; char *urls; - char *pdat; + char *urlenc; + struct fetch_multipart_data *multipart; int ctlfd; // fd for /mnt/web/N/ctl int bodyfd; // fd for /mnt/web/N/body @@ -85,8 +87,11 @@ void webfs_data_release(struct webfs_dat if(d->urls != NULL) { free(d->urls); } - if(d->pdat != NULL) { - free(d->pdat); + if(d->urlenc != NULL) { + free(d->urlenc); + } + if(d->multipart != NULL) { + fetch_multipart_data_destroy(d->multipart); } if(d->ctlfd != -1) { close(d->ctlfd); @@ -385,22 +390,20 @@ void start_data(struct webfs_data *d) { } void send_request(struct webfs_data *d) { - - if(d->pdat != NULL) { - fprintf(stderr, "[DBG]: Setting POST.\n"); - int n = write(d->ctlfd, "request POST", 12); - if(n <= 0) { - char *e = strerror(errno); - fprintf(stderr, "[DBG]: [%s] Failed to set POST REQUEST. Error: %s\n", d->urls, e); - d->state = DATA_STATE_ERROR; - d->err = "Failed to clone webfs."; // TODO: report strerror? - return; - } + char *s; + int fd, n; + struct fetch_multipart_data *part; + + s = calloc(3+1+strlen(d->urls)+1, sizeof(char)); + if(s == NULL){ + fprintf(stderr, "[DBG] send_request: OOM\n"); + d->state = DATA_STATE_ERROR; + d->err = "OOM"; + return; } - - char urlstr[1024]; // TODO dynamic size? - sprintf(urlstr, "url %s", d->urls); - int n = write(d->ctlfd, urlstr, strlen(urlstr)); + sprintf(s, "url %s", d->urls); + n = write(d->ctlfd, s, strlen(s)); + free(s); if(n <= 0) { char *e = strerror(errno); fprintf(stderr, "[DBG]: [%s] Failed to open URL. Error: %s\n", d->urls, e); @@ -408,7 +411,45 @@ void send_request(struct webfs_data *d) d->err = "Failed to clone webfs."; // TODO: report strerror? return; } - + /* POST */ + if(d->urlenc != NULL || d->multipart != NULL) { + s = calloc(strlen(d->webdir)+8+1, sizeof(char)); + sprintf(s, "%spostbody", d->webdir); + fd = open(s, O_WRONLY); + free(s); + if(fd < 0) { + char *e = strerror(errno); + fprintf(stderr, "[DBG] failed to open postbody file; %s\n", e); + d->state = DATA_STATE_ERROR; + d->err = "Failed to open POST body"; + return; + } + if(d->urlenc != NULL) { + n = write(fd, d->urlenc, strlen(d->urlenc)); + if(n <= 0) { + close(fd); + char *e = strerror(errno); + fprintf(stderr, "[DBG] Could not write post data: Error: %s\n", e); + d->state = DATA_STATE_ERROR; + d->err = "Could not write post data."; // TODO: report strerror? + return; + } + } else if(d->multipart != NULL) { + write(d->ctlfd, "headers Content-Type: multipart/form-data; boundary=HJBOUNDARY", 62); + for(part = d->multipart; part; part = part->next) { + if(part->file) { + fprintf(stderr, "[DBG] webfs::send_request: file part not implemented\n"); + continue; + } + n = snprintf(NULL, 0, "--HJBOUNDARY\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", part->name, part->value); + s = malloc((n+1)*sizeof(char)); + sprintf(s, "--HJBOUNDARY\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", part->name, part->value); + write(fd, s, n); + } + write(fd, "--HJBOUNDARY--\r\n", strlen("--HJBOUNDARY--\r\n")); + } + close(fd); + } d->state = DATA_STATE_REQUESTED; } @@ -464,6 +505,7 @@ void read_data(struct webfs_data *d) { } if(n == 0) { + close(d->bodyfd); d->state = DATA_STATE_DONE; return; } @@ -567,7 +609,6 @@ void update_webfs(void *ignored) { guit->misc->schedule(10, update_webfs, NULL); } - /** * Retrieve a handle for a low-level cache object * @@ -587,16 +628,6 @@ nserror webfs_handle_retrieve(nsurl *url // We are going to ignore flags for now. - if(post != NULL) { - // TODO Implement POST data. - if(post->type == LLCACHE_POST_URL_ENCODED) { - fprintf(stderr, "[DBG]: POST DATA: [%s]\n", post->data.urlenc); - } else { - fprintf(stderr, "[DBG]: POST DATA NOT IMPLEMENTED!\n"); - } - return NSERROR_BAD_CONTENT; - } - char *scheme = lwc_string_data(nsurl_get_component(url, NSURL_SCHEME)); if(strcmp("http", scheme) != 0 && strcmp("https", scheme) != 0) { // TODO proper error handling. @@ -621,7 +652,21 @@ nserror webfs_handle_retrieve(nsurl *url char *url_cstr = nsurl_access(url); wh->data->urls = malloc(strlen(url_cstr) + 1); strcpy(wh->data->urls, url_cstr); - wh->data->pdat = NULL; + wh->data->urlenc = NULL; + wh->data->multipart = NULL; + if(post != NULL) { + switch(post->type) { + case LLCACHE_POST_URL_ENCODED: + wh->data->urlenc = strdup(post->data.urlenc); + break; + case LLCACHE_POST_MULTIPART: + wh->data->multipart = fetch_multipart_data_clone(post->data.multipart); + break; + default: + fprintf(stderr, "[DBG] encode_post_data: unknown post request type %d\n", post->type); + break; + } + } wh->data->ctlfd = -1; wh->data->bodyfd = -1; wh->data->webdir = NULL; --upas-shujvxpfgbzkmgsfxryfydcpvu--