On June 11, 2014 6:18:19 AM CEST, Lawrence Teo <l...@openbsd.org> wrote:
>This diff allows ftp(1) to change the User-Agent for HTTP(S) URL
>requests via the FTPUSERAGENT environment variable (personally I prefer
>HTTPUSERAGENT but FTPUSERAGENT is what's used by ftp(1) on other BSDs).
>
>This is useful when fetching URLs that are sensitive to the User-Agent,
>such as sites that send different content if you're using a mobile
>browser/device.

I generally dislike passing options as environment variables. The use case you 
describe does not really strike me as something I'd have in my $ENV.

Does any of the other ftp's have a corresponding switch for it?

/Alexander

>
>I have tested this on amd64 and i386, including a make build/release
>and
>a bsd.rd http install with the resulting sets.
>
>Comments? OK?
>
>
>Index: fetch.c
>===================================================================
>RCS file: /cvs/src/usr.bin/ftp/fetch.c,v
>retrieving revision 1.122
>diff -u -p -u -p -r1.122 fetch.c
>--- fetch.c    20 May 2014 01:25:23 -0000      1.122
>+++ fetch.c    20 May 2014 02:47:40 -0000
>@@ -893,10 +893,10 @@ again:
>               if (cookie)
>                       ftp_printf(fin, ssl, "GET %s HTTP/1.0\r\n"
>                           "Proxy-Authorization: Basic %s%s\r\n%s\r\n\r\n",
>-                          epath, cookie, buf ? buf : "", HTTP_USER_AGENT);
>+                          epath, cookie, buf ? buf : "", httpuseragent);
>               else
>                       ftp_printf(fin, ssl, "GET %s HTTP/1.0\r\n%s%s\r\n\r\n",
>-                          epath, buf ? buf : "", HTTP_USER_AGENT);
>+                          epath, buf ? buf : "", httpuseragent);
> 
>       } else {
> #ifndef SMALL
>@@ -954,7 +954,7 @@ again:
>                       ftp_printf(fin, ssl, ":%s", port);
> #endif /* !SMALL */
>               ftp_printf(fin, ssl, "\r\n%s%s\r\n\r\n",
>-                  buf ? buf : "", HTTP_USER_AGENT);
>+                  buf ? buf : "", httpuseragent);
>               if (verbose)
>                       fprintf(ttyout, "\n");
>       }
>@@ -1293,6 +1293,9 @@ auto_fetch(int argc, char *argv[], char 
>       char *cp, *url, *host, *dir, *file, *portnum;
>       char *username, *pass, *pathstart;
>       char *ftpproxy, *httpproxy;
>+#ifndef SMALL
>+      char *uagent = NULL;
>+#endif /* !SMALL */
>       int rval, xargc;
>       volatile int argpos;
>       int dirhasglob, filehasglob, oautologin;
>@@ -1313,6 +1316,18 @@ auto_fetch(int argc, char *argv[], char 
>       if ((httpproxy = getenv(HTTP_PROXY)) != NULL && *httpproxy == '\0')
>               httpproxy = NULL;
> 
>+      httpuseragent = HTTP_USER_AGENT;
>+#ifndef SMALL
>+      if ((cp = getenv("FTPUSERAGENT")) != NULL && *cp != '\0') {
>+              /* Ensure that User-Agent value is in a single line. */
>+              if (strcspn(cp, "\r\n") != strlen(cp))
>+                      errx(1, "Invalid FTPUSERAGENT: %s.", cp);
>+              if (asprintf(&uagent, "User-Agent: %s", cp) == -1)
>+                      errx(1, "Can't allocate memory for HTTP(S) User-Agent");
>+              httpuseragent = uagent;
>+      }
>+#endif /* !SMALL */
>+
>       /*
>        * Loop through as long as there's files to fetch.
>        */
>@@ -1583,6 +1598,9 @@ bad_ftp_url:
>       }
>       if (connected && rval != -1)
>               disconnect(0, NULL);
>+#ifndef SMALL
>+      free(uagent);
>+#endif /* !SMALL */
>       return (rval);
> }
> 
>@@ -1783,10 +1801,10 @@ proxy_connect(int socket, char *host, ch
>       if (cookie) {
>               l = asprintf(&connstr, "CONNECT %s:%s HTTP/1.1\r\n"
>                       "Proxy-Authorization: Basic %s\r\n%s\r\n\r\n",
>-                      host, port, cookie, HTTP_USER_AGENT);
>+                      host, port, cookie, httpuseragent);
>       } else {
>               l = asprintf(&connstr, "CONNECT %s:%s HTTP/1.1\r\n%s\r\n\r\n",
>-                      host, port, HTTP_USER_AGENT);
>+                      host, port, httpuseragent);
>       }
> 
>       if (l == -1)
>Index: ftp.1
>===================================================================
>RCS file: /cvs/src/usr.bin/ftp/ftp.1,v
>retrieving revision 1.91
>diff -u -p -u -p -r1.91 ftp.1
>--- ftp.1      23 Jan 2014 08:09:08 -0000      1.91
>+++ ftp.1      24 Jan 2014 15:50:32 -0000
>@@ -1705,6 +1705,10 @@ Default is port returned by a
> .Fn getservbyname
> lookup of
> .Dq ftpgate/tcp .
>+.It Ev FTPUSERAGENT
>+User-Agent header to use for HTTP(S) URL requests.
>+The default value is
>+.Dq Ox ftp .
> .It Ev HOME
> For default location of a
> .Pa .netrc
>Index: ftp_var.h
>===================================================================
>RCS file: /cvs/src/usr.bin/ftp/ftp_var.h,v
>retrieving revision 1.33
>diff -u -p -u -p -r1.33 ftp_var.h
>--- ftp_var.h  24 Dec 2013 13:00:59 -0000      1.33
>+++ ftp_var.h  28 Dec 2013 04:24:15 -0000
>@@ -181,6 +181,7 @@ char *httpport;                    /* port number to use 
> #ifndef SMALL
> char *httpsport;              /* port number to use for https connections */
> #endif /* !SMALL */
>+char *httpuseragent;          /* user agent for http(s) connections */
> char *gateport;                       /* port number to use for gateftp 
> connections */
> 
> jmp_buf       toplevel;               /* non-local goto stuff for cmd scanner 
> */

Reply via email to