mirror of
https://onedev.site.tesses.net/crosslang
synced 2026-02-08 17:15:45 +00:00
Add CopyToLimit, SetContentDisposition, GetUrlWithQuery, GetOriginalPathWithQuery, MakeAbsolute, WithLocationHeader, GetServerRoot, SendRedirect and add closure to MountableServer
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,35 +139,7 @@ namespace Tesses::CrossLang {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TObject Sqlite_Escape(GCList& ls, std::vector<TObject> args)
|
TObject Sqlite_Close(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)
|
|
||||||
{
|
{
|
||||||
SQLiteObject* sql;
|
SQLiteObject* sql;
|
||||||
if(GetArgumentHeap(args,0,sql))
|
if(GetArgumentHeap(args,0,sql))
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user