diff options
-rw-r--r-- | .travis.yml | 3 | ||||
-rw-r--r-- | lib/ur/json.ur | 6 | ||||
-rw-r--r-- | src/c/http.c | 20 | ||||
-rw-r--r-- | src/c/urweb.c | 13 | ||||
-rw-r--r-- | src/compiler.sml | 2 | ||||
-rw-r--r-- | src/mono_opt.sml | 2 |
6 files changed, 37 insertions, 9 deletions
diff --git a/.travis.yml b/.travis.yml index 1f768f6d..c9fb6537 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,8 +20,7 @@ before_install: - if command -v apt-get &>/dev/null; then sudo apt-get update -qq; fi - if command -v apt-get &>/dev/null; then sudo apt-get install -y mlton libicu-dev; fi - if command -v brew &>/dev/null; then brew update; fi - - if command -v brew &>/dev/null; then brew uninstall libtool; fi - - if command -v brew &>/dev/null; then brew install libtool; fi + - if command -v brew &>/dev/null; then brew upgrade libtool; fi - if command -v brew &>/dev/null; then brew install openssl mlton icu4c; fi - if command -v brew &>/dev/null; then export ICU_INCLUDES=-I"`brew --prefix icu4c`/include"; fi - if command -v brew &>/dev/null; then export ICU_LIBS=-L"`brew --prefix icu4c`/lib"; fi diff --git a/lib/ur/json.ur b/lib/ur/json.ur index 58822d4b..1222cdbf 100644 --- a/lib/ur/json.ur +++ b/lib/ur/json.ur @@ -165,6 +165,10 @@ fun rfc3339_in s = None => error <xml>Invalid RFC 3339 string "{[s]}"</xml> | Some (time, sep, rest) => let + val time = case String.split time #"." of + None => time + | Some (time, _) => time + val t = case readUtc (date ^ " " ^ time) of None => error <xml>Invalid RFC 3339 string "{[s]}"</xml> | Some t => t @@ -356,7 +360,7 @@ fun json_record_withOptional [ts ::: {Type}] [ots ::: {Type}] [ts ~ ots] escape name ^ ":" ^ j.ToJson v ^ (case acc of "" => "" | acc => "," ^ acc)) - "" ofl ojss onames (r --- _) + withRequired ofl ojss onames (r --- _) in "{" ^ withOptional ^ "}" end, diff --git a/src/c/http.c b/src/c/http.c index c1fccf4a..de2f1376 100644 --- a/src/c/http.c +++ b/src/c/http.c @@ -11,6 +11,7 @@ #include <unistd.h> #include <signal.h> #include <stdarg.h> +#include <sys/un.h> #include <pthread.h> @@ -335,7 +336,7 @@ static void *worker(void *data) { } static void help(char *cmd) { - printf("Usage: %s [-p <port>] [-a <IPv4 address>] [-A <IPv6 address>] [-t <thread count>] [-m <bytes>] [-k] [-q] [-T SEC]\nThe '-k' option turns on HTTP keepalive.\nThe '-q' option turns off some chatter on stdout.\nThe '-T' option sets socket recv timeout (0 disables timeout, default is 5 sec).\nThe '-m' sets the maximum size (in bytes) for any buffer used to hold HTTP data sent by clients. (The default is 1 MB.)\n", cmd); + printf("Usage: %s [-p <port>] [-a <IPv4 address>] [-A <IPv6 address>] [-u <UNIX socket>] [-t <thread count>] [-m <bytes>] [-k] [-q] [-T SEC]\nThe '-k' option turns on HTTP keepalive.\nThe '-q' option turns off some chatter on stdout.\nThe '-T' option sets socket recv timeout (0 disables timeout, default is 5 sec).\nThe '-m' sets the maximum size (in bytes) for any buffer used to hold HTTP data sent by clients. (The default is 1 MB.)\n", cmd); } static void sigint(int signum) { @@ -348,6 +349,7 @@ union uw_sockaddr { struct sockaddr sa; struct sockaddr_in ipv4; struct sockaddr_in6 ipv6; + struct sockaddr_un un; }; int main(int argc, char *argv[]) { @@ -367,7 +369,7 @@ int main(int argc, char *argv[]) { my_addr.sa.sa_family = AF_INET; my_addr.ipv4.sin_addr.s_addr = INADDR_ANY; // auto-fill with my IP - while ((opt = getopt(argc, argv, "hp:a:A:t:kqT:m:")) != -1) { + while ((opt = getopt(argc, argv, "hp:a:A:u:t:kqT:m:")) != -1) { switch (opt) { case '?': fprintf(stderr, "Unknown command-line option\n"); @@ -405,6 +407,15 @@ int main(int argc, char *argv[]) { } break; + case 'u': + my_addr.sa.sa_family = AF_UNIX; + if (!strncpy(my_addr.un.sun_path, optarg, sizeof(my_addr.un.sun_path)-1)) { + fprintf(stderr, "Invalid UNIX socket filename\n"); + help(argv[0]); + return 1; + } + break; + case 't': nthreads = atoi(optarg); if (nthreads <= 0) { @@ -474,6 +485,11 @@ int main(int argc, char *argv[]) { my_size = sizeof(my_addr.ipv6); my_addr.ipv6.sin6_port = htons(uw_port); break; + + case AF_UNIX: + unlink(my_addr.un.sun_path); + my_size = sizeof(my_addr.un); + break; } if (bind(sockfd, &my_addr.sa, my_size) < 0) { diff --git a/src/c/urweb.c b/src/c/urweb.c index a01b4aae..8ffe7dd3 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -3421,10 +3421,19 @@ uw_Basis_blob uw_Basis_stringToBlob_error(uw_context ctx, uw_Basis_string s, siz s += 2; while (*s) { + char a = s[0]; + s += 1; + char b; + if (*s){ + b = s[0]; + } else { + b = 0; + } int n; - sscanf(s, "%02x", &n); + char buf[3] = {a, b, 0}; + n = strtol(buf, NULL, 16); *r++ = n; - s += 2; + s += 1; } } else { while (*s) { diff --git a/src/compiler.sml b/src/compiler.sml index fab939f9..06abed0c 100644 --- a/src/compiler.sml +++ b/src/compiler.sml @@ -448,7 +448,7 @@ fun parseUrp' accLibs fname = sources = [fname], exe = fname ^ ".exe", sql = NONE, - endpoints = NONE, + endpoints = Settings.getEndpoints (), debug = Settings.getDebug (), profile = false, timeout = 120, diff --git a/src/mono_opt.sml b/src/mono_opt.sml index cc85f05b..7e737e44 100644 --- a/src/mono_opt.sml +++ b/src/mono_opt.sml @@ -161,7 +161,7 @@ fun unAs s = doChars (String.explode s, []) end -fun checkUrl s = CharVector.all Char.isGraph s andalso Settings.checkUrl s +fun checkUrl s = CharVector.all Char.isGraph s andalso (s = "#" orelse Settings.checkUrl s) val checkData = CharVector.all (fn ch => Char.isAlphaNum ch orelse ch = #"_" orelse ch = #"-") |