Browse Source

* Retrieve/send text bodies as string

Michael Van Canneyt 8 months ago
parent
commit
7d47b73170
1 changed files with 31 additions and 4 deletions
  1. 31 4
      packages/wasm-utils/src/wasm.pas2js.httpapi.pas

+ 31 - 4
packages/wasm-utils/src/wasm.pas2js.httpapi.pas

@@ -36,7 +36,9 @@ Type
     Url : String;
     Url : String;
     Method : String;
     Method : String;
     Headers : TStringDynArray;
     Headers : TStringDynArray;
+    BodyIsString : Boolean;
     Body : TJSArrayBuffer;
     Body : TJSArrayBuffer;
+    BodyAsText : string;
     Integrity : String;
     Integrity : String;
     Redirect: string;
     Redirect: string;
     Cache : String;
     Cache : String;
@@ -89,6 +91,7 @@ Type
     FNextRequestID : TWasmHTTPRequestID;
     FNextRequestID : TWasmHTTPRequestID;
     FLogApiCalls: Boolean;
     FLogApiCalls: Boolean;
     FRequests : TJSOBject;
     FRequests : TJSOBject;
+    class function ContentTypeIsString(aType: String): boolean;
     function ReadRequest(aRequest :PWasmHTTPRequest) : TWasmHTTPRequest;
     function ReadRequest(aRequest :PWasmHTTPRequest) : TWasmHTTPRequest;
     function RequestExecute(aRequestID: TWasmHTTPRequestID): TWasmHTTPResult;
     function RequestExecute(aRequestID: TWasmHTTPRequestID): TWasmHTTPResult;
   Protected
   Protected
@@ -117,6 +120,8 @@ Function CacheToString(aCache : Integer) : String;
 
 
 implementation
 implementation
 
 
+uses strutils;
+
 Const
 Const
   CacheNames : Array[0..5] of string = ('default','no-store','reload','no-cache','force-cache','only-if-cached');
   CacheNames : Array[0..5] of string = ('default','no-store','reload','no-cache','force-cache','only-if-cached');
   ModeNames : Array[0..4] of string = ('cors','same-origin','no-cors','navigate','websocket');
   ModeNames : Array[0..4] of string = ('cors','same-origin','no-cors','navigate','websocket');
@@ -260,7 +265,9 @@ begin
     MaybeInit('cache',Cache);
     MaybeInit('cache',Cache);
     MaybeInit('integrity',Integrity);
     MaybeInit('integrity',Integrity);
     if Assigned(Body) then
     if Assigned(Body) then
-      lRequestInit['body']:=Body;
+      lRequestInit['body']:=Body
+    else if BodyIsString and (BodyAsText<>'') then
+      lRequestInit['body']:=BodyAsText;
     if KeepAlive then
     if KeepAlive then
     lRequestInit['keepalive']:=KeepAlive;
     lRequestInit['keepalive']:=KeepAlive;
     MaybeInit('redirect',Redirect);
     MaybeInit('redirect',Redirect);
@@ -299,6 +306,18 @@ end;
 
 
 { TWasmHTTPAPI }
 { TWasmHTTPAPI }
 
 
+class function TWasmHTTPAPI.ContentTypeIsString(aType : String) : boolean;
+
+begin
+  Result:=False;
+  aType:=LowerCase(ExtractWord(1,aType,';'));
+  case LowerCase(aType) of
+    'application/json',
+    'text/text',
+    'text/html' : Result:=True;
+  end;
+end;
+
 function TWasmHTTPAPI.ReadRequest(aRequest: PWasmHTTPRequest): TWasmHTTPRequest;
 function TWasmHTTPAPI.ReadRequest(aRequest: PWasmHTTPRequest): TWasmHTTPRequest;
 
 
 Var
 Var
@@ -355,7 +374,7 @@ Var
 var
 var
   i : Integer;
   i : Integer;
   Hdrs : Longint;
   Hdrs : Longint;
-
+  lHeader,lHeaderName,lHeaderValue : String;
 begin
 begin
   v:=getModuleMemoryDataView;
   v:=getModuleMemoryDataView;
   P:=aRequest;
   P:=aRequest;
@@ -370,10 +389,18 @@ begin
   inc(P,SizeInt32);
   inc(P,SizeInt32);
   for I:=0 to HeaderCount-1 do
   for I:=0 to HeaderCount-1 do
     begin
     begin
-    Result.Headers[i]:=GetStringFromAddr(Hdrs);
+    lHeader:=GetStringFromAddr(Hdrs);
+    Result.Headers[i]:=lHeader;
+    lHeaderName:=Trim(ExtractWord(1,lHeader,':'));
+    lHeaderValue:=Trim(ExtractWord(2,lHeader,':'));
+    if SameText(lheaderName,'Content-Type') then
+      Result.BodyIsString:=ContentTypeIsString(lHeaderValue);
     inc(Hdrs,SizeInt32*2);
     inc(Hdrs,SizeInt32*2);
     end;
     end;
-  Result.Body:=GetBuffer;
+  if Result.BodyIsString then
+    Result.BodyAsText:=GetString
+  else
+    Result.Body:=GetBuffer;
   Result.Integrity:=GetString;
   Result.Integrity:=GetString;
   Result.Redirect:=RedirectToString(GetInt32);
   Result.Redirect:=RedirectToString(GetInt32);
   Result.Cache:=CacheToString(GetInt32);
   Result.Cache:=CacheToString(GetInt32);