home *** CD-ROM | disk | FTP | other *** search
/ Game Level Design / GLDesign.bin / Software / UnrealEngine2Runtime / UE2Runtime-22262001_Demo.exe / UWeb / Classes / WebConnection.uc < prev    next >
Text File  |  2003-10-22  |  4KB  |  231 lines

  1. class WebConnection extends TcpLink;
  2.  
  3. var WebServer WebServer;
  4. var string ReceivedData;
  5.  
  6. var WebRequest Request;
  7. var WebResponse Response;
  8. var WebApplication Application;
  9.  
  10. var int RawBytesExpecting;
  11.  
  12. event Accepted()
  13. {
  14.     WebServer = WebServer(Owner);
  15.     SetTimer(30, False);
  16. }
  17.  
  18. event Closed()
  19. {
  20.     Destroy();
  21. }
  22.  
  23. event Timer()
  24. {
  25.     Close();
  26. }
  27.  
  28. event ReceivedText( string Text )
  29. {
  30.     local int i;
  31.     local string S;
  32.  
  33.     ReceivedData = ReceivedData $ Text;
  34.     if(RawBytesExpecting > 0)
  35.     {
  36.         RawBytesExpecting -= Len(Text);
  37.         CheckRawBytes();
  38.  
  39.         return;
  40.     }
  41.  
  42.     // remove a LF which arrived in a new packet
  43.     // and thus didn't get cleaned up by the code below
  44.     if(Left(ReceivedData, 1) == Chr(10))
  45.         ReceivedData = Mid(ReceivedData, 1);
  46.     i = InStr(ReceivedData, Chr(13));
  47.     while(i != -1)
  48.     {
  49.         S = Left(ReceivedData, i);
  50.         i++;
  51.         // check for any LF following the CR.
  52.         if(Mid(ReceivedData, i, 1) == Chr(10))
  53.             i++;
  54.  
  55.         ReceivedData = Mid(ReceivedData, i);
  56.  
  57.         ReceivedLine(S);
  58.         
  59.         if(LinkState != STATE_Connected)
  60.             return;
  61.         if(RawBytesExpecting > 0)
  62.         {    
  63.             CheckRawBytes();
  64.             return;
  65.         }
  66.  
  67.         i = InStr(ReceivedData, Chr(13));
  68.     }
  69. }
  70.  
  71. function ReceivedLine(string S)
  72. {
  73.     if(Left(S, 4) ~= "GET ")
  74.         ProcessGet(S);
  75.     else    
  76.     if(Left(S, 5) ~= "POST ")
  77.         ProcessPost(S);
  78.     else
  79.     if(S == "")
  80.         EndOfHeaders();
  81.     else
  82.     if(Request != None)
  83.     {
  84.         Request.ProcessHeaderString(S);
  85.     }
  86. }
  87.  
  88. function ProcessGet(string S)
  89. {
  90.     local int i;
  91.  
  92.     if(Request == None)
  93.         CreateResponseObject();
  94.  
  95.     Request.RequestType = Request_GET;
  96.     S = Mid(S, 4);
  97.     while(Left(S, 1) == " ")
  98.         S = Mid(S, 1);
  99.  
  100.     i = InStr(S, " ");
  101.  
  102.     if(i != -1)
  103.         S = Left(S, i);
  104.  
  105.     i = InStr(S, "?");
  106.     if(i != -1)
  107.     {
  108.         Request.DecodeFormData(Mid(S, i+1));
  109.         S = Left(S, i);
  110.     }
  111.  
  112.     Application = WebServer.GetApplication(S, Request.URI);
  113.     if(Application != None && Request.URI == "")
  114.     {
  115.         Response.Redirect(WebServer.ServerURL$S$"/");
  116.         Cleanup();
  117.     }
  118.     else
  119.     if(Application == None && Webserver.DefaultApplication != -1)
  120.     {
  121.         Response.Redirect(WebServer.ServerURL$Webserver.ApplicationPaths[Webserver.DefaultApplication]$"/");
  122.         Cleanup();
  123.     }
  124. }
  125.  
  126. function ProcessPost(string S)
  127. {
  128.     local int i;
  129.  
  130.     if(Request == None)
  131.         CreateResponseObject();
  132.  
  133.     Request.RequestType = Request_POST;
  134.  
  135.     S = Mid(S, 5);
  136.     while(Left(S, 1) == " ")
  137.         S = Mid(S, 1);
  138.  
  139.     i = InStr(S, " ");
  140.  
  141.     if(i != -1)
  142.         S = Left(S, i);
  143.  
  144.     i = InStr(S, "?");
  145.     if(i != -1)
  146.     {
  147.         Request.DecodeFormData(Mid(S, i+1));
  148.         S = Left(S, i);
  149.     }
  150.     Application = WebServer.GetApplication(S, Request.URI);
  151.     if(Application != None && Request.URI == "")
  152.     {
  153.         Response.Redirect(WebServer.ServerURL$S$"/");
  154.         Cleanup();
  155.     }
  156. }
  157.  
  158. function CreateResponseObject()
  159. {
  160.     Request = new(None) class'WebRequest';
  161.  
  162.     Response = new(None) class'WebResponse';
  163.     Response.Connection = Self;
  164. }
  165.  
  166. function EndOfHeaders()
  167. {
  168.     if(Response == None)
  169.     {
  170.         CreateResponseObject();
  171.         Response.HTTPError(400); // Bad Request
  172.         Cleanup();
  173.         return;
  174.     }
  175.  
  176.     if(Application == None)
  177.     {
  178.         Response.HTTPError(404); // FNF
  179.         Cleanup();
  180.         return;
  181.     }
  182.  
  183.     if(Request.ContentLength != 0 && Request.RequestType == Request_POST)
  184.     {
  185.         RawBytesExpecting = Request.ContentLength;
  186.         RawBytesExpecting -= Len(ReceivedData);
  187.         CheckRawBytes();
  188.     }
  189.     else
  190.     {
  191.         Application.Query(Request, Response);
  192.         Cleanup();
  193.     }
  194. }
  195.  
  196. function CheckRawBytes()
  197. {
  198.     if(RawBytesExpecting <= 0)
  199.     {
  200.         if(!(Request.ContentType ~= "application/x-www-form-urlencoded"))
  201.         {
  202.             Log("WebConnection: Unknown form data content-type: "$Request.ContentType);
  203.             Response.HTTPError(400); // Can't deal with this type of form data
  204.         }
  205.         else
  206.         {
  207.             Request.DecodeFormData(ReceivedData);
  208.             Application.Query(Request, Response);
  209.             ReceivedData = "";
  210.         }
  211.         Cleanup();
  212.     }
  213. }
  214.  
  215. function Cleanup()
  216. {
  217.     if(Request != None)
  218.         Request = None;
  219.  
  220.     if(Response != None)
  221.     {
  222.         Response.Connection = None;
  223.         Response = None;
  224.     }
  225.  
  226.     if(Application != None)
  227.         Application = None;
  228.  
  229.     Close();
  230. }
  231.