Add CopyToLimit, SetContentDisposition, GetUrlWithQuery, GetOriginalPathWithQuery, MakeAbsolute, WithLocationHeader, GetServerRoot, SendRedirect and add closure to MountableServer

This commit is contained in:
2025-10-15 23:18:44 -05:00
parent 1e5167ab8b
commit b889b09287
5 changed files with 144 additions and 36 deletions

View File

@@ -52,6 +52,6 @@ namespace Tesses::CrossLang {
void TStd::RegisterHelpers(GC* gc, TRootEnvironment* env) void TStd::RegisterHelpers(GC* gc, TRootEnvironment* env)
{ {
auto helpers=env->EnsureDictionary(gc,"Helpers"); auto helpers=env->EnsureDictionary(gc,"Helpers");
helpers->DeclareFunction(gc,"CopyToProgress","Copy Stream to another (but with progress event)",{"src","dest","progressCB"},Helpers_CopyToProgress); helpers->DeclareFunction(gc,"CopyToProgress","Copy Stream to another (but with progress event)",{"src","dest","progressCB","$precision"},Helpers_CopyToProgress);
} }
} }

View File

@@ -206,7 +206,41 @@ namespace Tesses::CrossLang
} }
return _ls; return _ls;
} }
else if(key == "SetContentDisposition")
{
std::string type;
std::string filename;
std::string fieldName;
if(GetArgument(args,0,filename) && GetArgument(args,1,type))
{
ContentDisposition dispo;
dispo.filename = filename;
dispo.type = type;
if(GetArgument(args,2, fieldName))
dispo.fieldName = fieldName;
this->dict->SetValue("Content-Disposition", dispo.ToString());
}
return nullptr;
}
else if(key == "TryGetContentDisposition")
{
std::string cdStr;
ContentDisposition cd;
if(this->dict->TryGetFirst("Content-Disposition", cdStr) && ContentDisposition::TryParse(cdStr,cd))
{
return TDictionary::Create(ls,{
TDItem("Type",cd.type),
TDItem("FileName",cd.filename),
TDItem("FieldName",cd.fieldName)
});
}
return nullptr;
}
return Undefined(); return Undefined();
} }
}; };
@@ -381,6 +415,60 @@ namespace Tesses::CrossLang
if(GetArgumentHeap(args,0,ba)) if(GetArgumentHeap(args,0,ba))
ctx->SendBytes(ba->data); ctx->SendBytes(ba->data);
} }
else if(key == "GetUrlWithQuery")
{
return ctx->GetUrlWithQuery();
}
else if(key == "GetOriginalPathWithQuery")
{
return ctx->GetOriginalPathWithQuery();
}
else if(key == "MakeAbsolute")
{
std::string path;
if(GetArgument(args,0,path))
{
return ctx->MakeAbsolute(path);
}
return nullptr;
}
else if(key == "WithLocationHeader")
{
std::string path;
if(GetArgument(args,0,path))
{
int64_t sc;
if(GetArgument(args,1,sc))
{
ctx->WithLocationHeader(path,(StatusCode)sc);
return nullptr;
}
ctx->WithLocationHeader(path);
}
return this;
}
else if(key == "GetServerRoot")
{
return ctx->GetServerRoot();
}
else if(key == "SendRedirect")
{
std::string path;
if(GetArgument(args,0,path))
{
int64_t sc;
if(GetArgument(args,1,sc))
{
ctx->SendRedirect(path,(StatusCode)sc);
return nullptr;
}
ctx->SendRedirect(path);
}
return nullptr;
}
else if(key == "WriteHeaders") ctx->WriteHeaders(); else if(key == "WriteHeaders") ctx->WriteHeaders();
else if(key == "StartWebSocketSession") { else if(key == "StartWebSocketSession") {
TDictionary* dict; TDictionary* dict;
@@ -1422,10 +1510,17 @@ namespace Tesses::CrossLang
return nullptr; return nullptr;
}); });
http->DeclareFunction(gc, "MountableServer","Create a server you can mount to, must mount parents before child",{"root"}, [](GCList& ls, std::vector<TObject> args)->TObject{ http->DeclareFunction(gc, "MountableServer","Create a server you can mount to, must mount parents before child",{"root"}, [](GCList& ls, std::vector<TObject> args)->TObject{
TCallable* call;
TDictionary* dict; TDictionary* dict;
TClassObject* cls; TClassObject* cls;
std::shared_ptr<Tesses::Framework::Http::IHttpServer> mySvr; std::shared_ptr<Tesses::Framework::Http::IHttpServer> mySvr;
if(GetArgumentHeap(args,0,dict)) if(GetArgumentHeap(args,0,call))
{
auto svr = std::make_shared<TObjectHttpServer>(ls.GetGC(), call);
return std::make_shared<MountableServer>(svr);
}
else if(GetArgumentHeap(args,0,dict))
{ {
auto svr = std::make_shared<TObjectHttpServer>(ls.GetGC(), dict); auto svr = std::make_shared<TObjectHttpServer>(ls.GetGC(), dict);
return std::make_shared<MountableServer>(svr); return std::make_shared<MountableServer>(svr);

View File

@@ -5,6 +5,35 @@
namespace Tesses::CrossLang { namespace Tesses::CrossLang {
#if defined(TESSESFRAMEWORK_ENABLE_SQLITE) #if defined(TESSESFRAMEWORK_ENABLE_SQLITE)
using namespace Tesses::Framework::Serialization; using namespace Tesses::Framework::Serialization;
TObject Sqlite_Escape(GCList& ls, std::vector<TObject> args)
{
int64_t n;
double d;
bool b;
std::string str;
if(GetArgument(args,0,str))
{
return SQLiteDatabase::Escape(str);
}
if(GetArgument(args,0,n))
{
return std::to_string(n);
}
if(GetArgument(args,0,b))
{
return b ? "1" : "0";
}
if(GetArgument(args,0,d))
{
return std::to_string(d);
}
return "NULL";
}
class SQLiteObject : public TNativeObject class SQLiteObject : public TNativeObject
{ {
public: public:
@@ -34,11 +63,7 @@ namespace Tesses::CrossLang {
{ {
if(name == "Close") this->Close(); if(name == "Close") this->Close();
if(name == "Escape") { if(name == "Escape") {
std::string str; return Sqlite_Escape(ls,args);
if(GetArgument(args,0,str))
{
return SQLiteDatabase::Escape(str); //here for completeness
}
} }
if(name == "Exec") if(name == "Exec")
{ {
@@ -114,34 +139,6 @@ namespace Tesses::CrossLang {
} }
TObject Sqlite_Escape(GCList& ls, std::vector<TObject> args)
{
int64_t n;
double d;
bool b;
std::string str;
if(GetArgument(args,0,str))
{
return SQLiteDatabase::Escape(str);
}
if(GetArgument(args,0,n))
{
return std::to_string(n);
}
if(GetArgument(args,0,b))
{
return b ? "1" : "0";
}
if(GetArgument(args,0,d))
{
return std::to_string(d);
}
return "NULL";
}
TObject Sqlite_Close(GCList& ls, std::vector<TObject> args) TObject Sqlite_Close(GCList& ls, std::vector<TObject> args)
{ {
SQLiteObject* sql; SQLiteObject* sql;

View File

@@ -959,6 +959,7 @@ namespace Tesses::CrossLang
if(std::holds_alternative<std::string>(_obj)) return "String"; if(std::holds_alternative<std::string>(_obj)) return "String";
if(std::holds_alternative<Tesses::Framework::Filesystem::VFSPath>(_obj)) return "Path"; if(std::holds_alternative<Tesses::Framework::Filesystem::VFSPath>(_obj)) return "Path";
if(std::holds_alternative<TVMVersion>(_obj)) return "Version";
if(std::holds_alternative<TDateTime>(_obj)) return "DateTime"; if(std::holds_alternative<TDateTime>(_obj)) return "DateTime";
if(std::holds_alternative<std::shared_ptr<Tesses::Framework::Streams::Stream>>(_obj)) if(std::holds_alternative<std::shared_ptr<Tesses::Framework::Streams::Stream>>(_obj))
{ {
@@ -1373,6 +1374,8 @@ namespace Tesses::CrossLang
env->DeclareVariable("Version", TDictionary::Create(ls,{ env->DeclareVariable("Version", TDictionary::Create(ls,{
TDItem("Parse",TExternalMethod::Create(ls,"Parse version from string",{"versionStr"},[](GCList& ls, std::vector<TObject> args)->TObject{ TDItem("Parse",TExternalMethod::Create(ls,"Parse version from string",{"versionStr"},[](GCList& ls, std::vector<TObject> args)->TObject{
std::string str; std::string str;
TVMVersion v;
if(GetArgument(args,0,v)) return v;
if(GetArgument(args, 0, str)) if(GetArgument(args, 0, str))
{ {
TVMVersion version; TVMVersion version;

View File

@@ -3489,6 +3489,19 @@ namespace Tesses::CrossLang {
cse.back()->Push(gc, nullptr); cse.back()->Push(gc, nullptr);
return false; return false;
} }
if(key == "CopyToLimit")
{
std::shared_ptr<Tesses::Framework::Streams::Stream> data;
int64_t cnt;
int64_t buffSize;
if(GetArgument(args,0,data) && GetArgument(args,1,cnt))
{
if(!GetArgument<int64_t>(args,2,buffSize)) buffSize=1024;
strm->CopyToLimit(data,(uint64_t)cnt,(size_t)buffSize);
}
cse.back()->Push(gc, nullptr);
return false;
}
if(key == "Flush") if(key == "Flush")
{ {
strm->Flush(); strm->Flush();