Server: post gzipped message and response (loooong post, sorry)

Malte Brill revolution at derbrill.de
Mon Jan 18 14:02:45 EST 2016


Hi all,

I am struggeling with something that used to work with the 5.x Server engine (on Mac but I need it X-Plat)

I am trying to POST compressed XML to Server and reply with compressed XML from there. With the 7.x engines of server this breaks:

<?lc

local sPostDataCompressedFlag,sPostData
local sReply

libServerReadIncomingData
libServerReturnResponse

command libServerReadIncomingData
  put $_POST_RAW into sPostData
  if sPostData is empty then
    libServerRequestMethodError
    exit libserverReadIncomingData
  end if
   --- if the data has been compressed, we need to decompress it
   try
      put decompress(sPostData) into sPostData
      put TRUE into sPostDataCompressedFlag
   catch tErr
      put FALSE into sPostDataCompressedFlag
   end try
   
   --- parse out the XML data
   local tPostDataXml
   put revCreateXMLTree(sPostData, TRUE, TRUE, FALSE) into tPostDataXml
   
   local tPostDataRootNode,tPostDataActivity
   put revXmlRootNode(tPostDataXml) into tPostDataRootNode
   
   local tPostDataRequest
   put revXmlAttribute(tPostDataXml, tPostDataRootNode, "type") into tPostDataRequest
	switch (tPostDataRequest)
      	case "ping"
      		requestPing
      	break
      	default
        	requestUnknown tPostDataXML
		break
   end switch
end libServerReadIncomingData

command libServerReturnResponse
  if sReply is empty then
  	put "error: reply is empty" into sReply
  end if	
  if (sPostDataCompressedFlag) then
    put compress(sReply) into sReply
  end if
  put "Content-Type: text/xml" & CRLF into tHeader
  put "Content-Encoding: gzip" &CRLF after tHeader
  put "Content-Length:" && length(sReply) after tHeader
  put new header tHeader
  put sReply
end libServerReturnResponse

command libServerBuildReply pType, pData
  put "<?xml version=" & quote & "1.0" & quote && "encoding=" & quote & "UTF-8" & quote &"?>" into sReply
  put crlf & "<response type=" & quote & pType & quote &">DATA</response>" after sReply
  replace "DATA" with pData in sReply
end libServerBuildReply

command libServerRequestMethodError
  libServerBuildReply "error", "Requested method not supported"
end libServerRequestMethodError

command requestPing
  libServerBuildReply "ping", "<timestamp>" & the milliseconds & "</timestamp>" & CRLF & \
         "<info>ok</info>" & CRLF
end requestPing

command requestUnknown pRoot,pRequest
  libServerBuildReply "error", "<timestamp>" & the milliseconds & "</timestamp>" & CRLF & \
         "<error>unknown request:"&cr&pRoot&cr&length(sPostData)&"</error>" & CRLF
end requestUnknown

?>

On The client Side I have:

on sendRequest pRequest,pCompress
   local tXML,tURL
   put "<?xml version=" & quote & "1.0" & quote && "encoding=" & quote & "UTF-8" & quote && "?>" into tXML
   put "<request type=" & quote & pRequest & quote &"/>" after tXML
   put fld "theURL" into tURL
   if pCompress then
      post compress(tXML) to URL tURL
   else
      post tXML to URL tURL
   end if
   handleRequest it
end sendRequest

on handleRequest pResponse
   try
      put decompress(pResponse) into fld "output"
   catch theErr
      put theErr & cr & cr & pResponse into fld "output"
   end try
end handleRequest

Now if I do a compressed version of my ping request:

      sendRequest "ping“,true

I get:

<?xml version="1.0" encoding=%UTF-8“?> — wrong here… Why the %???
<response type="ping"><timestamp>1453143362202</timestamp>
<info>ok</info>
</response>

the uncompressed call:

<?xml version="1.0" encoding="UTF-8"?>
<response type="ping"><timestamp>1453143583747</timestamp>
<info>ok</info>
</response>

works as expected. Even worse for:

      sendRequest "irgendwas“,true

Which comes back totally garbled most of the time…

Anybody got an idea what changed between 5.x and 7 that breaks compressed transfer? Anybody got a solution?

Cheers,

Malte






More information about the Use-livecode mailing list