]> git.proxmox.com Git - mirror_edk2.git/blobdiff - AppPkg/Applications/Sockets/WebServer/HTTP.c
Merged socket development branch:
[mirror_edk2.git] / AppPkg / Applications / Sockets / WebServer / HTTP.c
index 8487de751a1287074b90c452f8273d7cb1109215..9a8bd70a9d62f71b5b464732c7357e19d8e97320 100644 (file)
@@ -401,8 +401,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 +413,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 +439,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
@@ -1213,7 +1214,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 +1275,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 +1306,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 +1425,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