Icon View Thread

The following is the text of the current message along with any replies.
Messages 1 to 2 of 2 total
Thread Build own HTTP Server
Thu, Mar 21 2013 11:15 AMPermanent Link

Walter Matte

Tactical Business Corporation

FYI - in case anyone else builds a Server to respond to Database.Load and Database.Commit request from EWB apps.  (EWB 1.01 b5)

Everything worked without issue on IE and FF.  Chrome and Mobile Browsers gave me Error: Database commit response error.  There are two things to work around.  One in the JS and one in your Server.

1.  First you need to manually remove the one Content-Length command in the JS file.  (Tim is fixing this for the next release.)  It will be in the .commit() function:

This Line - remove it.  It should not be there.  It does not bother IE or FF - but Chrome and Mobile browsers fail.

        temprequest.tserverrequest_frequestheaders.tstrings_setvalue("Content-Length", inttostr(length(temprequest.tserverrequest_frequestcontent.gettext())));


If you have Compress Code  - just search for Content-Length (there is only one) and remove.  Each line is delimited with ; so from after the ; to the next - remove.  It will look something like this:

e4.E_e8.O_hx("Content-Length",c3(ca(e4.E_hl.bC())));


2.  Chrome Browsers issue an HTTP OPTIONS request prior to the HTTP POST generated by a Database.Commit.  So your sever needs to respond to an OPTIONS request.

Here is the code I have - I use RealThinClient components for my HTTP Server - that responds to the OPTIONS request.

// ============================================================================
//  Commit Data
// ============================================================================
procedure TdmRTCProviders.dpCommitCheckRequest(Sender: TRtcConnection);
begin
 with Sender as TRtcDataServer do
 begin
   if (Uppercase(Request.FileName)) = '/DATASET' then
     Accept;
 end;  
end;

// Respond
procedure TdmRTCProviders.dpCommitDataReceived(Sender: TRtcConnection);
var
 Conn : IUniSQLPool;
 sJson : string;
 i : integer;
begin
 with Sender as TRtcDataServer do
 begin
   if (Request.Method='OPTIONS') then
   begin
     if Request.Complete then
     begin

       for i := 0 to Request.ItemCount - 1  do
          if Uppercase(request.ItemName[i]) = 'ACCESS-CONTROL-REQUEST-HEADERS' then
           Response.HeaderText := Response.HeaderText + RtcString('Access-Control-Allow-Headers: ' + request.ItemValue[i]  + #13#10);
            
       Response.HeaderText := Response.HeaderText +
         RtcString('Access-Control-Allow-Origin: *' + #13#10) +
         RtcString('Access-Control-Allow-Methods: POST,GET,OPTIONS' + #13#10) +   
         RtcString('Allow: POST,GET,OPTIONS' + #13#10) +
         RtcString('Public: POST,GET,OPTIONS' + #13#10);
         Write(RtcString(''));
     end;
   end
   else
   begin
     Request.Params.AddText(Read);
     if (Request.Complete) then
     begin
       Conn := FConnections.LockConnection;
       try
         sJson :=  Request.Params.Text;

         Response.HeaderText :=
           Response.HeaderText +
           RtcString('Access-Control-Allow-Origin: *' + #13#10) +
           RtcString('Cache-Control: must-revalidate, post-check=0, pre-check=0' + #13#10) +
           RtcString('Cache-Control: no-cache, no-store' + #13#10);
       
         Write(RtcString(Conn.EWBCommit(sJson)));
       finally
         FConnections.UnlockConnection(Conn);
       end;
     end;
   end;           
 end;  
end;



Walter
Thu, Mar 21 2013 2:46 PMPermanent Link

Tim Young [Elevate Software]

Elevate Software, Inc.

Avatar

Email timyoung@elevatesoft.com

Walter,

<< FYI - in case anyone else builds a Server to respond to Database.Load and
Database.Commit request from EWB apps.  (EWB 1.01 b5) >>

Thanks, also very good information.

Tim Young
Elevate Software
www.elevatesoft.com
Image