diff --git a/uppsrc/Skylark/Compile.cpp b/uppsrc/Skylark/Compile.cpp index 18b76d587..861f1db1f 100644 --- a/uppsrc/Skylark/Compile.cpp +++ b/uppsrc/Skylark/Compile.cpp @@ -40,6 +40,8 @@ int CountLinkArgs(const Vector& part) int args = 0; for(int i = 0; i < part.GetCount(); i++) { int p = (byte)*part[i]; + if(p == 255) // it's a ** node, we can supply unlimited number of arguments + return -1; if(p >= 0 && p < 30) args = max(args, p + 1); } diff --git a/uppsrc/Skylark/Dispatch.cpp b/uppsrc/Skylark/Dispatch.cpp index af4c4188f..247a528b8 100644 --- a/uppsrc/Skylark/Dispatch.cpp +++ b/uppsrc/Skylark/Dispatch.cpp @@ -138,15 +138,17 @@ void RegisterView0(void (*fn)(Http&), Callback1 cb, const char *id, Strin if(IsDigit(s[1])) linkargpos = argpos = minmax(atoi(~s + 1), 0, 30); else - if(s[1] == '*') + if(s[1] == '*') { argpos = DISPATCH_VARARGS; + linkargpos = 255; + } q = DispatchMap.GetCount(); LLOG(" Adding arg " << argpos << ": " << q); n.subnode.Add(Null, q); DispatchMap.Add(); DispatchMap[q].argpos = argpos; if(primary) - linkpart.Add(String(linkargpos++, 1)); + linkpart.Add(String(min(linkargpos++,255), 1)); } else { if(primary) diff --git a/uppsrc/Skylark/Http.cpp b/uppsrc/Skylark/Http.cpp index 981411af9..940e463d1 100644 --- a/uppsrc/Skylark/Http.cpp +++ b/uppsrc/Skylark/Http.cpp @@ -326,6 +326,12 @@ void MakeLink(StringBuffer& out, const Vector& part, const Vector { LTIMING("MakeLink"); out.Cat("/"); + Bits usedArgs; + for(int i = 0; i < part.GetCount(); i++) { + int q = (byte)*part[i]; + if(q < 32) + usedArgs.Set(q); + } for(int i = 0; i < part.GetCount(); i++) { const String& p = part[i]; if(i) @@ -335,6 +341,19 @@ void MakeLink(StringBuffer& out, const Vector& part, const Vector if(q >= 0 && q < arg.GetCount()) sUrlEncode(out, AsString(arg[q])); } + else + if(q == 255) { + bool first = true; + for(int j=0; j