]> git.proxmox.com Git - mirror_edk2.git/blobdiff - AppPkg/Applications/Sockets/WebServer/HTTP.c
BaseTools/BinToPcd: Fix Python 2.7.x compatibility issue
[mirror_edk2.git] / AppPkg / Applications / Sockets / WebServer / HTTP.c
index 8487de751a1287074b90c452f8273d7cb1109215..fae1dd9269072f59612135fd93c999112b96fd6d 100644 (file)
@@ -1,30 +1,21 @@
-/*++\r
-  This file contains an 'Intel UEFI Application' and is\r
-  licensed for Intel CPUs and chipsets under the terms of your\r
-  license agreement with Intel or your vendor.  This file may\r
-  be modified by the user, subject to additional terms of the\r
-  license agreement\r
---*/\r
-/*++\r
-\r
-Copyright (c)  2011 Intel Corporation. All rights reserved\r
-This software and associated documentation (if any) is furnished\r
-under a license and may only be used or copied in accordance\r
-with the terms of the license. Except as permitted by such\r
-license, no part of this software or documentation may be\r
-reproduced, stored in a retrieval system, or transmitted in any\r
-form or by any means without the express written consent of\r
-Intel Corporation.\r
-\r
---*/\r
-\r
-/** @file\r
+/**\r
+  @file\r
   HTTP processing for the web server.\r
 \r
+  Copyright (c) 2011-2012, Intel Corporation\r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
 **/\r
 \r
 #include <WebServer.h>\r
 \r
+\r
 /**\r
   Get a UTF-8 character from the buffer\r
 \r
@@ -401,8 +392,8 @@ HttpPageTrailer (
   int RetVal;\r
   EFI_STATUS Status;\r
   socklen_t LengthInBytes;\r
-  struct sockaddr_in LocalAddress;\r
-  struct sockaddr_in RemoteAddress;\r
+  struct sockaddr_in6 LocalAddress;\r
+  struct sockaddr_in6 RemoteAddress;\r
 \r
   DBG_ENTER ( );\r
 \r
@@ -413,12 +404,13 @@ HttpPageTrailer (
     LengthInBytes = sizeof ( LocalAddress );\r
     RetVal = getsockname ( SocketFD, (struct sockaddr *)&LocalAddress, &LengthInBytes );\r
     if ( 0 == RetVal ) {\r
+      LengthInBytes = sizeof ( LocalAddress );\r
       RetVal = getpeername ( SocketFD, (struct sockaddr *)&RemoteAddress, &LengthInBytes );\r
       if ( 0 == RetVal ) {\r
         //\r
         //  Seperate the body from the trailer\r
         //\r
-        Status = HttpSendAnsiString ( SocketFD, pPort, "  <hr>\r\n" );\r
+        Status = HttpSendAnsiString ( SocketFD, pPort, "  <hr>\r\n<code>" );\r
         if ( EFI_ERROR ( Status )) {\r
           break;\r
         }\r
@@ -438,7 +430,7 @@ HttpPageTrailer (
         if ( EFI_ERROR ( Status )) {\r
           break;\r
         }\r
-        Status = HttpSendAnsiString ( SocketFD, pPort, "\r\n" );\r
+        Status = HttpSendAnsiString ( SocketFD, pPort, "</code>\r\n" );\r
         if ( EFI_ERROR ( Status )) {\r
           break;\r
         }\r
@@ -917,7 +909,7 @@ HttpSendDump (
       Status = HttpSendHexBits ( SocketFD,\r
                                  pPort,\r
                                  sizeof ( pData ) * 8,\r
-                                 (UINT64)pData );\r
+                                 (UINT64)(UINTN)pData );\r
       if ( EFI_ERROR ( Status )) {\r
         break;\r
       }\r
@@ -1213,7 +1205,7 @@ HttpSendHexBits (
     //\r
     Digit = (UINT32)(( Value >> Shift ) & 0xf );\r
     if ( 10 <= Digit ) {\r
-      Digit += 'A' - '0' - 10;\r
+      Digit += 'a' - '0' - 10;\r
     }\r
 \r
     //\r
@@ -1274,7 +1266,7 @@ HttpSendHexValue (
     //\r
     Digit = (UINT32)(( Value >> Shift ) & 0xf );\r
     if ( 10 <= Digit ) {\r
-      Digit += 'A' - '0' - 10;\r
+      Digit += 'a' - '0' - 10;\r
     }\r
 \r
     //\r
@@ -1305,6 +1297,112 @@ HttpSendHexValue (
 }\r
 \r
 \r
+/**\r
+  Output an IP6 address value to the HTML page\r
+\r
+  @param [in] SocketFD          Socket file descriptor\r
+  @param [in] pPort             The WSDT_PORT structure address\r
+  @param [in] Value             Value to display\r
+  @param [in] bFirstValue       TRUE if first value\r
+  @param [in] bLastValue        TRUE if last value\r
+  @param [in] bZeroSuppression  TRUE while zeros are being suppressed\r
+  @param [in] pbZeroSuppression Address to receive TRUE when zero suppression\r
+                                has started, use NULL if next colon value not\r
+                                needed.\r
+\r
+  @retval EFI_SUCCESS Successfully displayed the address\r
+**/\r
+EFI_STATUS\r
+HttpSendIp6Value (\r
+  IN int SocketFD,\r
+  IN WSDT_PORT * pPort,\r
+  IN UINT16 Value,\r
+  IN BOOLEAN bFirstValue,\r
+  IN BOOLEAN bLastValue,\r
+  IN BOOLEAN bZeroSuppression,\r
+  IN BOOLEAN * pbZeroSuppression\r
+  )\r
+{\r
+  BOOLEAN bZeroSuppressionStarting;\r
+  UINT32 Digit;\r
+  EFI_STATUS Status;\r
+\r
+  //\r
+  //  Use break instead of goto\r
+  //\r
+  bZeroSuppressionStarting = FALSE;\r
+  Status = EFI_SUCCESS;\r
+  for ( ; ; ) {\r
+    //\r
+    //  Display the leading colon if necessary\r
+    //\r
+    if ( bZeroSuppression && ( bLastValue || ( 0 != Value ))) {\r
+      Status = HttpSendByte ( SocketFD, pPort, ':' );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+    }\r
+\r
+    //\r
+    //  Skip over a series of zero values\r
+    //\r
+    bZeroSuppressionStarting = (BOOLEAN)( 0 == Value );\r
+    if ( !bZeroSuppressionStarting ) {\r
+      //\r
+      //  Display the value\r
+      //\r
+      Digit = ( Value >> 4 ) & 0xf;\r
+      Status = HttpSendHexValue ( SocketFD,\r
+                                  pPort,\r
+                                  Digit );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Digit = Value & 0xf;\r
+      Status = HttpSendHexValue ( SocketFD,\r
+                                  pPort,\r
+                                  Digit );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Digit = ( Value >> 12 ) & 0xf;\r
+      Status = HttpSendHexValue ( SocketFD,\r
+                                  pPort,\r
+                                  Digit );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Digit = ( Value >> 8 ) & 0xf;\r
+      Status = HttpSendHexValue ( SocketFD,\r
+                                  pPort,\r
+                                  Digit );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+    }\r
+\r
+    //\r
+    //  Display the trailing colon if necessary\r
+    //\r
+    if (( !bLastValue ) && ( bFirstValue || ( 0 != Value ))) {\r
+      Status = HttpSendByte ( SocketFD, pPort, ':' );\r
+    }\r
+    break;\r
+  }\r
+\r
+  //\r
+  //  Return the next colon display\r
+  if ( NULL != pbZeroSuppression ) {\r
+    *pbZeroSuppression = bZeroSuppressionStarting;\r
+  }\r
+\r
+  //\r
+  //  Return the operation status\r
+  //\r
+  return Status;\r
+}\r
+\r
+\r
 /**\r
   Output an IP address to the HTML page\r
 \r
@@ -1318,41 +1416,109 @@ EFI_STATUS
 HttpSendIpAddress (\r
   IN int SocketFD,\r
   IN WSDT_PORT * pPort,\r
-  IN struct sockaddr_in * pAddress\r
+  IN struct sockaddr_in6 * pAddress\r
   )\r
 {\r
+  BOOLEAN bZeroSuppression;\r
+  UINT32 Index;\r
+  struct sockaddr_in * pIpv4;\r
+  struct sockaddr_in6 * pIpv6;\r
+  UINT16 PortNumber;\r
   EFI_STATUS Status;\r
 \r
   //\r
-  //  Output the IPv4 address\r
+  //  Use break instead of goto\r
   //\r
-  Status = HttpSendValue ( SocketFD, pPort, (UINT8)pAddress->sin_addr.s_addr );\r
-  if ( !EFI_ERROR ( Status )) {\r
-    Status = HttpSendByte ( SocketFD, pPort, '.' );\r
-    if ( !EFI_ERROR ( Status )) {\r
-      Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pAddress->sin_addr.s_addr >> 8 ));\r
-      if ( !EFI_ERROR ( Status )) {\r
-        Status = HttpSendByte ( SocketFD, pPort, '.' );\r
-        if ( !EFI_ERROR ( Status )) {\r
-          Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pAddress->sin_addr.s_addr >> 16 ));\r
-          if ( !EFI_ERROR ( Status )) {\r
-            Status = HttpSendByte ( SocketFD, pPort, '.' );\r
-            if ( !EFI_ERROR ( Status )) {\r
-              Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pAddress->sin_addr.s_addr >> 24 ));\r
-              if ( !EFI_ERROR ( Status )) {\r
-                //\r
-                //  Output the port number\r
-                //\r
-                Status = HttpSendByte ( SocketFD, pPort, ':' );\r
-                if ( !EFI_ERROR ( Status )) {\r
-                  Status = HttpSendValue ( SocketFD, pPort, htons ( pAddress->sin_port ));\r
-                }\r
-              }\r
-            }\r
-          }\r
+  for ( ; ; ) {\r
+    //\r
+    //  Determine the type of address\r
+    //\r
+    if ( AF_INET6 == pAddress->sin6_family ) {\r
+      pIpv6 = pAddress;\r
+\r
+      //\r
+      //  Display the address in RFC2732 format\r
+      //\r
+      bZeroSuppression = FALSE;\r
+      Status = HttpSendByte ( SocketFD, pPort, '[' );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      for ( Index = 0; 8 > Index; Index++ ) {\r
+        Status = HttpSendIp6Value ( SocketFD,\r
+                                    pPort,\r
+                                    pIpv6->sin6_addr.__u6_addr.__u6_addr16[ Index ],\r
+                                    (BOOLEAN)( 0 == Index ),\r
+                                    (BOOLEAN)( 7 == Index ),\r
+                                    bZeroSuppression,\r
+                                    &bZeroSuppression );\r
+        if ( EFI_ERROR ( Status )) {\r
+          break;\r
         }\r
       }\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+\r
+      //\r
+      //  Separate the port number\r
+      //\r
+      Status = HttpSendByte ( SocketFD, pPort, ']' );\r
+\r
+      //\r
+      //  Get the port number\r
+      //\r
+      PortNumber = pIpv6->sin6_port;\r
     }\r
+    else {\r
+      //\r
+      //  Output the IPv4 address\r
+      //\r
+      pIpv4 = (struct sockaddr_in *)pAddress;\r
+      Status = HttpSendValue ( SocketFD, pPort, (UINT8)pIpv4->sin_addr.s_addr );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Status = HttpSendByte ( SocketFD, pPort, '.' );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pIpv4->sin_addr.s_addr >> 8 ));\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Status = HttpSendByte ( SocketFD, pPort, '.' );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pIpv4->sin_addr.s_addr >> 16 ));\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Status = HttpSendByte ( SocketFD, pPort, '.' );\r
+      if ( EFI_ERROR ( Status )) {\r
+        break;\r
+      }\r
+      Status = HttpSendValue ( SocketFD, pPort, (UINT8)( pIpv4->sin_addr.s_addr >> 24 ));\r
+\r
+      //\r
+      //  Get the port number\r
+      //\r
+      PortNumber = pIpv4->sin_port;\r
+    }\r
+    if ( EFI_ERROR ( Status )) {\r
+      break;\r
+    }\r
+\r
+    //\r
+    //  Display the port number\r
+    //\r
+    Status = HttpSendByte ( SocketFD, pPort, ':' );\r
+    if ( EFI_ERROR ( Status )) {\r
+      break;\r
+    }\r
+    Status = HttpSendValue ( SocketFD, pPort, htons ( PortNumber ));\r
+    break;\r
   }\r
 \r
   //\r
@@ -1488,25 +1654,25 @@ HttpSendValue (
   CONST UINT64 * pEnd;\r
   CONST UINT64 * pDivisor;\r
   CONST UINT64 pDivisors[ ] = {\r
-     10000000000000000000L,\r
-      1000000000000000000L,\r
-       100000000000000000L,\r
-        10000000000000000L,\r
-         1000000000000000L,\r
-          100000000000000L,\r
-           10000000000000L,\r
-            1000000000000L,\r
-             100000000000L,\r
-              10000000000L,\r
-               1000000000L,\r
-                100000000L,\r
-                 10000000L,\r
-                  1000000L,\r
-                   100000L,\r
-                    10000L,\r
-                     1000L,\r
-                      100L,\r
-                       10L\r
+     10000000000000000000ULL,\r
+      1000000000000000000ULL,\r
+       100000000000000000ULL,\r
+        10000000000000000ULL,\r
+         1000000000000000ULL,\r
+          100000000000000ULL,\r
+           10000000000000ULL,\r
+            1000000000000ULL,\r
+             100000000000ULL,\r
+              10000000000ULL,\r
+               1000000000ULL,\r
+                100000000ULL,\r
+                 10000000ULL,\r
+                  1000000ULL,\r
+                   100000ULL,\r
+                    10000ULL,\r
+                     1000ULL,\r
+                      100ULL,\r
+                       10ULL\r
   };\r
   EFI_STATUS Status;\r
   UINT64 Temp;\r