summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml3
-rw-r--r--lib/ur/json.ur6
-rw-r--r--src/c/http.c20
-rw-r--r--src/c/urweb.c13
-rw-r--r--src/compiler.sml2
-rw-r--r--src/mono_opt.sml2
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 = #"-")