Reverting HDFS-5307 & HDFS-5317 from branch-2.2.0 since rc0 for hadoop-2.2.0 is already out.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2.2.0@1530132 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
index 7f11743..6c385fb 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
+++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
@@ -64,12 +64,6 @@
     HDFS-5259. Support client which combines appended data with old data
     before sends it to NFS server. (brandonli)
 
-    HDFS-5307. Support both HTTP and HTTPS in jsp pages (Haohui Mai via
-    branconli)
-
-    HDFS-5317. Go back to DFS Home link does not work on datanode webUI
-    (Haohui Mai via brandonli)
-
 Release 2.1.1-beta - 2013-09-23
 
   INCOMPATIBLE CHANGES
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/JspHelper.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/JspHelper.java
index 0db4e87..02fb54e 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/JspHelper.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/JspHelper.java
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hdfs.server.common;
 
 import com.google.common.base.Charsets;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.classification.InterfaceAudience;
@@ -56,7 +55,6 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.jsp.JspWriter;
-
 import java.io.ByteArrayInputStream;
 import java.io.DataInputStream;
 import java.io.IOException;
@@ -103,7 +101,7 @@
       return super.hashCode();
     }
   }
-
+ 
   // compare two records based on their frequency
   private static class NodeRecordComparator implements Comparator<NodeRecord> {
 
@@ -117,27 +115,6 @@
       return 0;
     }
   }
-
-  /**
-   * A helper class that generates the correct URL for different schema.
-   *
-   */
-  public static final class Url {
-    public static String authority(String scheme, DatanodeID d) {
-      if (scheme.equals("http")) {
-        return d.getInfoAddr();
-      } else if (scheme.equals("https")) {
-        return d.getInfoSecureAddr();
-      } else {
-        throw new IllegalArgumentException("Unknown scheme:" + scheme);
-      }
-    }
-
-    public static String url(String scheme, DatanodeID d) {
-      return scheme + "://" + authority(scheme, d);
-    }
-  }
-
   public static DatanodeInfo bestNode(LocatedBlocks blks, Configuration conf)
       throws IOException {
     HashMap<DatanodeInfo, NodeRecord> map =
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeJspHelper.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeJspHelper.java
index 1319ed5..8357897 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeJspHelper.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeJspHelper.java
@@ -18,7 +18,6 @@
 package org.apache.hadoop.hdfs.server.datanode;
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.URL;
@@ -35,7 +34,6 @@
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.UnresolvedLinkException;
 import org.apache.hadoop.hdfs.DFSClient;
 import org.apache.hadoop.hdfs.DFSConfigKeys;
 import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
@@ -46,21 +44,15 @@
 import org.apache.hadoop.hdfs.security.token.block.BlockTokenSecretManager;
 import org.apache.hadoop.hdfs.server.common.JspHelper;
 import org.apache.hadoop.http.HtmlQuoting;
+import org.apache.hadoop.http.HttpConfig;
 import org.apache.hadoop.net.NetUtils;
-import org.apache.hadoop.security.AccessControlException;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.token.Token;
 import org.apache.hadoop.util.ServletUtil;
 import org.apache.hadoop.util.StringUtils;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-
 @InterfaceAudience.Private
 public class DatanodeJspHelper {
-  private static final int PREV_BLOCK = -1;
-  private static final int NEXT_BLOCK = 1;
-
   private static DFSClient getDFSClient(final UserGroupInformation user,
                                         final String addr,
                                         final Configuration conf
@@ -143,10 +135,10 @@
           out.print("Empty file");
         } else {
           DatanodeInfo chosenNode = JspHelper.bestNode(firstBlock, conf);
+          String fqdn = canonicalize(chosenNode.getIpAddr());
           int datanodePort = chosenNode.getXferPort();
-          String redirectLocation = JspHelper.Url.url(req.getScheme(),
-              chosenNode)
-              + "/browseBlock.jsp?blockId="
+          String redirectLocation = HttpConfig.getSchemePrefix() + fqdn + ":"
+              + chosenNode.getInfoPort() + "/browseBlock.jsp?blockId="
               + firstBlock.getBlock().getBlockId() + "&blockSize="
               + firstBlock.getBlock().getNumBytes() + "&genstamp="
               + firstBlock.getBlock().getGenerationStamp() + "&filename="
@@ -318,8 +310,8 @@
       dfs.close();
       return;
     }
-
-    String tailUrl = "///" + JspHelper.Url.authority(req.getScheme(), chosenNode)
+    String fqdn = canonicalize(chosenNode.getIpAddr());
+    String tailUrl = "///" + fqdn + ":" + chosenNode.getInfoPort()
         + "/tail.jsp?filename=" + URLEncoder.encode(filename, "UTF-8")
         + "&namenodeInfoPort=" + namenodeInfoPort
         + "&chunkSizeToView=" + chunkSizeToView
@@ -367,7 +359,8 @@
       for (int j = 0; j < locs.length; j++) {
         String datanodeAddr = locs[j].getXferAddr();
         datanodePort = locs[j].getXferPort();
-        String blockUrl = "///" + JspHelper.Url.authority(req.getScheme(), locs[j])
+        fqdn = canonicalize(locs[j].getIpAddr());
+        String blockUrl = "///" + fqdn + ":" + locs[j].getInfoPort()
             + "/browseBlock.jsp?blockId=" + blockidstring
             + "&blockSize=" + blockSize
             + "&filename=" + URLEncoder.encode(filename, "UTF-8")
@@ -497,23 +490,112 @@
     out.print("<a href=\"#viewOptions\">Advanced view/download options</a><br>");
     out.print("<hr>");
 
-    String authority = req.getServerName() + ":" + req.getServerPort();
-    String nextUrl = generateLinksForAdjacentBlock(NEXT_BLOCK, authority,
-        datanodePort, startOffset, chunkSizeToView, blockSize, blockId,
-        genStamp, dfs, filename, conf, req.getScheme(), tokenString,
-        namenodeInfoPort, nnAddr);
-    if (nextUrl != null) {
+    // Determine the prev & next blocks
+    long nextStartOffset = 0;
+    long nextBlockSize = 0;
+    String nextBlockIdStr = null;
+    String nextGenStamp = null;
+    String nextHost = req.getServerName();
+    int nextPort = req.getServerPort();
+    int nextDatanodePort = datanodePort;
+    // determine data for the next link
+    if (startOffset + chunkSizeToView >= blockSize) {
+      // we have to go to the next block from this point onwards
+      List<LocatedBlock> blocks = dfs.getNamenode().getBlockLocations(filename, 0,
+          Long.MAX_VALUE).getLocatedBlocks();
+      for (int i = 0; i < blocks.size(); i++) {
+        if (blocks.get(i).getBlock().getBlockId() == blockId) {
+          if (i != blocks.size() - 1) {
+            LocatedBlock nextBlock = blocks.get(i + 1);
+            nextBlockIdStr = Long.toString(nextBlock.getBlock().getBlockId());
+            nextGenStamp = Long.toString(nextBlock.getBlock()
+                .getGenerationStamp());
+            nextStartOffset = 0;
+            nextBlockSize = nextBlock.getBlock().getNumBytes();
+            DatanodeInfo d = JspHelper.bestNode(nextBlock, conf);
+            nextDatanodePort = d.getXferPort();
+            nextHost = d.getIpAddr();
+            nextPort = d.getInfoPort();
+          }
+        }
+      }
+    } else {
+      // we are in the same block
+      nextBlockIdStr = blockId.toString();
+      nextStartOffset = startOffset + chunkSizeToView;
+      nextBlockSize = blockSize;
+      nextGenStamp = genStamp.toString();
+    }
+    String nextUrl = null;
+    if (nextBlockIdStr != null) {
+      nextUrl = "///" + canonicalize(nextHost) + ":" + nextPort
+          + "/browseBlock.jsp?blockId=" + nextBlockIdStr
+          + "&blockSize=" + nextBlockSize
+          + "&startOffset=" + nextStartOffset
+          + "&genstamp=" + nextGenStamp
+          + "&filename=" + URLEncoder.encode(filename, "UTF-8")
+          + "&chunkSizeToView=" + chunkSizeToView
+          + "&datanodePort=" + nextDatanodePort
+          + "&namenodeInfoPort=" + namenodeInfoPort
+          + JspHelper.getDelegationTokenUrlParam(tokenString)
+          + JspHelper.getUrlParam(JspHelper.NAMENODE_ADDRESS, nnAddr);
       out.print("<a href=\"" + nextUrl + "\">View Next chunk</a>&nbsp;&nbsp;");
     }
-
-    String prevUrl = generateLinksForAdjacentBlock(PREV_BLOCK, authority,
-        datanodePort, startOffset, chunkSizeToView, blockSize, blockId,
-        genStamp, dfs, filename, conf, req.getScheme(), tokenString,
-        namenodeInfoPort, nnAddr);
-    if (prevUrl != null) {
-      out.print("<a href=\"" + prevUrl + "\">View Prev chunk</a>&nbsp;&nbsp;");
+    // determine data for the prev link
+    String prevBlockIdStr = null;
+    String prevGenStamp = null;
+    long prevStartOffset = 0;
+    long prevBlockSize = 0;
+    String prevHost = req.getServerName();
+    int prevPort = req.getServerPort();
+    int prevDatanodePort = datanodePort;
+    if (startOffset == 0) {
+      List<LocatedBlock> blocks = dfs.getNamenode().getBlockLocations(filename, 0,
+          Long.MAX_VALUE).getLocatedBlocks();
+      for (int i = 0; i < blocks.size(); i++) {
+        if (blocks.get(i).getBlock().getBlockId() == blockId) {
+          if (i != 0) {
+            LocatedBlock prevBlock = blocks.get(i - 1);
+            prevBlockIdStr = Long.toString(prevBlock.getBlock().getBlockId());
+            prevGenStamp = Long.toString(prevBlock.getBlock()
+                .getGenerationStamp());
+            prevStartOffset = prevBlock.getBlock().getNumBytes()
+                - chunkSizeToView;
+            if (prevStartOffset < 0)
+              prevStartOffset = 0;
+            prevBlockSize = prevBlock.getBlock().getNumBytes();
+            DatanodeInfo d = JspHelper.bestNode(prevBlock, conf);
+            prevDatanodePort = d.getXferPort();
+            prevHost = d.getIpAddr();
+            prevPort = d.getInfoPort();
+          }
+        }
+      }
+    } else {
+      // we are in the same block
+      prevBlockIdStr = blockId.toString();
+      prevStartOffset = startOffset - chunkSizeToView;
+      if (prevStartOffset < 0)
+        prevStartOffset = 0;
+      prevBlockSize = blockSize;
+      prevGenStamp = genStamp.toString();
     }
 
+    String prevUrl = null;
+    if (prevBlockIdStr != null) {
+      prevUrl = "///" + canonicalize(prevHost) + ":" + prevPort
+          + "/browseBlock.jsp?blockId=" + prevBlockIdStr
+          + "&blockSize=" + prevBlockSize
+          + "&startOffset=" + prevStartOffset
+          + "&filename=" + URLEncoder.encode(filename, "UTF-8")
+          + "&chunkSizeToView=" + chunkSizeToView
+          + "&genstamp=" + prevGenStamp
+          + "&datanodePort=" + prevDatanodePort
+          + "&namenodeInfoPort=" + namenodeInfoPort
+          + JspHelper.getDelegationTokenUrlParam(tokenString)
+          + JspHelper.getUrlParam(JspHelper.NAMENODE_ADDRESS, nnAddr);
+      out.print("<a href=\"" + prevUrl + "\">View Prev chunk</a>&nbsp;&nbsp;");
+    }
     out.print("<hr>");
     out.print("<textarea cols=\"100\" rows=\"25\" wrap=\"virtual\" style=\"width:100%\" READONLY>");
     try {
@@ -528,71 +610,6 @@
     dfs.close();
   }
 
-  private static String generateLinksForAdjacentBlock(final int direction,
-      String authority, int datanodePort, long startOffset,
-      int chunkSizeToView, long blockSize, long blockId, Long genStamp,
-      final DFSClient dfs, final String filename, final Configuration conf,
-      final String scheme, final String tokenString,
-      final int namenodeInfoPort, final String nnAddr)
-      throws AccessControlException, FileNotFoundException,
-      UnresolvedLinkException, IOException {
-
-    boolean found = false;
-    if ((direction == NEXT_BLOCK && startOffset + chunkSizeToView < blockSize)
-        || (direction == PREV_BLOCK && startOffset != 0)) {
-      // we are in the same block
-      found = true;
-
-      if (direction == NEXT_BLOCK) {
-        startOffset = startOffset + chunkSizeToView;
-      } else {
-        startOffset = Math.max(0, startOffset - chunkSizeToView);
-      }
-    } else {
-      List<LocatedBlock> blocks = dfs.getNamenode().getBlockLocations(filename, 0,
-          Long.MAX_VALUE).getLocatedBlocks();
-
-      final long curBlockId = blockId;
-      int curBlockIdx = Iterables.indexOf(blocks, new Predicate<LocatedBlock>() {
-        @Override
-        public boolean apply(LocatedBlock b) {
-          return b.getBlock().getBlockId() == curBlockId;
-        }
-      });
-      found = curBlockIdx != -1 &&
-          ((direction == NEXT_BLOCK && curBlockIdx < blocks.size() - 1)
-              || (direction == PREV_BLOCK && curBlockIdx > 0));
-
-      if (found) {
-        LocatedBlock nextBlock = blocks.get(curBlockIdx + direction);
-
-        blockId = nextBlock.getBlock().getBlockId();
-        genStamp = nextBlock.getBlock().getGenerationStamp();
-        startOffset = 0;
-        blockSize = nextBlock.getBlock().getNumBytes();
-        DatanodeInfo d = JspHelper.bestNode(nextBlock, conf);
-        datanodePort = d.getXferPort();
-        authority = JspHelper.Url.authority(scheme, d);
-      }
-    }
-
-    if (found) {
-      return "///" + authority
-          + "/browseBlock.jsp?blockId=" + blockId
-          + "&blockSize=" + blockSize
-          + "&startOffset=" + startOffset
-          + "&genstamp=" + genStamp
-          + "&filename=" + URLEncoder.encode(filename, "UTF-8")
-          + "&chunkSizeToView=" + chunkSizeToView
-          + "&datanodePort=" + datanodePort
-          + "&namenodeInfoPort=" + namenodeInfoPort
-          + JspHelper.getDelegationTokenUrlParam(tokenString)
-          + JspHelper.getUrlParam(JspHelper.NAMENODE_ADDRESS, nnAddr);
-    } else {
-      return null;
-    }
-  }
-
   static void generateFileChunksForTail(JspWriter out, HttpServletRequest req,
                                         Configuration conf
                                         ) throws IOException,
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ClusterJspHelper.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ClusterJspHelper.java
index c3e4987..3f43edd 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ClusterJspHelper.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ClusterJspHelper.java
@@ -887,16 +887,7 @@
 
   private static String queryMbean(String httpAddress, Configuration conf) 
     throws IOException {
-    /**
-     * Although the other namenode might support HTTPS, it is fundamentally
-     * broken to get the JMX via an HTTPS connection inside the namenode,
-     * because in HTTPS set up the principal of the client and the one of
-     * the namenode differs. Therefore, there is no guarantees that the
-     * HTTPS connection can be set up.
-     *
-     * As a result, we just hard code the connection as an HTTP connection.
-     */
-    URL url = new URL("http://" + httpAddress + JMX_QRY);
+    URL url = new URL(HttpConfig.getSchemePrefix() + httpAddress+JMX_QRY);
     return readOutput(url);
   }
   /**
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java
index 8957765..8c5386c 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NamenodeJspHelper.java
@@ -642,21 +642,25 @@
     // We can't redirect if there isn't a DN to redirect to.
     // Lets instead show a proper error message.
     FSNamesystem fsn = nn.getNamesystem();
-
-    DatanodeID datanode = null;
-    if (fsn != null && fsn.getNumLiveDataNodes() >= 1) {
-      datanode = getRandomDatanode(nn);
-    }
-
-    if (datanode == null) {
+    if (fsn == null || fsn.getNumLiveDataNodes() < 1) {
       throw new IOException("Can't browse the DFS since there are no " +
           "live nodes available to redirect to.");
     }
-
+    final DatanodeID datanode = getRandomDatanode(nn);;
     UserGroupInformation ugi = JspHelper.getUGI(context, request, conf);
-    // if the user is defined, get a delegation token and stringify it
     String tokenString = getDelegationToken(
         nn.getRpcServer(), request, conf, ugi);
+    // if the user is defined, get a delegation token and stringify it
+    final String redirectLocation;
+    final String nodeToRedirect;
+    int redirectPort;
+    if (datanode != null) {
+      nodeToRedirect = datanode.getIpAddr();
+      redirectPort = datanode.getInfoPort();
+    } else {
+      nodeToRedirect = nn.getHttpAddress().getHostName();
+      redirectPort = nn.getHttpAddress().getPort();
+    }
 
     InetSocketAddress rpcAddr = nn.getNameNodeAddress();
     String rpcHost = rpcAddr.getAddress().isAnyLocalAddress()
@@ -664,14 +668,13 @@
       : rpcAddr.getAddress().getHostAddress();
     String addr = rpcHost + ":" + rpcAddr.getPort();
 
-    final String redirectLocation =
-        JspHelper.Url.url(request.getScheme(), datanode)
+    String fqdn = InetAddress.getByName(nodeToRedirect).getCanonicalHostName();
+    redirectLocation = HttpConfig.getSchemePrefix() + fqdn + ":" + redirectPort
         + "/browseDirectory.jsp?namenodeInfoPort="
-        + request.getServerPort() + "&dir=/"
+        + nn.getHttpAddress().getPort() + "&dir=/"
         + (tokenString == null ? "" :
            JspHelper.getDelegationTokenUrlParam(tokenString))
         + JspHelper.getUrlParam(JspHelper.NAMENODE_ADDRESS, addr);
-
     resp.sendRedirect(redirectLocation);
   }
 
@@ -726,11 +729,12 @@
     }
 
     private void generateNodeDataHeader(JspWriter out, DatanodeDescriptor d,
-        String suffix, boolean alive, int nnInfoPort, String nnaddr, String scheme)
+        String suffix, boolean alive, int nnHttpPort, String nnaddr)
         throws IOException {
       // from nn_browsedfscontent.jsp:
-      String url = "///" + JspHelper.Url.authority(scheme, d)
-          + "/browseDirectory.jsp?namenodeInfoPort=" + nnInfoPort + "&dir="
+      String url = "///" + d.getHostName() + ":"
+          + d.getInfoPort()
+          + "/browseDirectory.jsp?namenodeInfoPort=" + nnHttpPort + "&dir="
           + URLEncoder.encode("/", "UTF-8")
           + JspHelper.getUrlParam(JspHelper.NAMENODE_ADDRESS, nnaddr);
 
@@ -747,9 +751,9 @@
     }
 
     void generateDecommissioningNodeData(JspWriter out, DatanodeDescriptor d,
-        String suffix, boolean alive, int nnInfoPort, String nnaddr, String scheme)
+        String suffix, boolean alive, int nnHttpPort, String nnaddr)
         throws IOException {
-      generateNodeDataHeader(out, d, suffix, alive, nnInfoPort, nnaddr, scheme);
+      generateNodeDataHeader(out, d, suffix, alive, nnHttpPort, nnaddr);
       if (!alive) {
         return;
       }
@@ -773,7 +777,7 @@
     }
     
     void generateNodeData(JspWriter out, DatanodeDescriptor d, String suffix,
-        boolean alive, int nnInfoPort, String nnaddr, String scheme) throws IOException {
+        boolean alive, int nnHttpPort, String nnaddr) throws IOException {
       /*
        * Say the datanode is dn1.hadoop.apache.org with ip 192.168.0.5 we use:
        * 1) d.getHostName():d.getPort() to display. Domain and port are stripped
@@ -785,7 +789,7 @@
        * interact with datanodes.
        */
 
-      generateNodeDataHeader(out, d, suffix, alive, nnInfoPort, nnaddr, scheme);
+      generateNodeDataHeader(out, d, suffix, alive, nnHttpPort, nnaddr);
       if (!alive) {
         out.print("<td class=\"decommissioned\"> " + 
             d.isDecommissioned() + "\n");
@@ -851,8 +855,11 @@
       final List<DatanodeDescriptor> dead = new ArrayList<DatanodeDescriptor>();
       dm.fetchDatanodes(live, dead, true);
 
-      String nnaddr = nn.getServiceRpcAddress().getAddress().getHostName() + ":"
-          + nn.getServiceRpcAddress().getPort();
+      InetSocketAddress nnSocketAddress =
+          (InetSocketAddress)context.getAttribute(
+              NameNodeHttpServer.NAMENODE_ADDRESS_ATTRIBUTE_KEY);
+      String nnaddr = nnSocketAddress.getAddress().getHostAddress() + ":"
+          + nnSocketAddress.getPort();
 
       whatNodes = request.getParameter("whatNodes"); // show only live or only
                                                      // dead nodes
@@ -888,11 +895,16 @@
 
       counterReset();
 
+      try {
+        Thread.sleep(1000);
+      } catch (InterruptedException e) {
+      }
+
       if (live.isEmpty() && dead.isEmpty()) {
         out.print("There are no datanodes in the cluster");
       } else {
 
-        int nnInfoPort = request.getServerPort();
+        int nnHttpPort = nn.getHttpAddress().getPort();
         out.print("<div id=\"dfsnodetable\"> ");
         if (whatNodes.equals("LIVE")) {
           out.print("<a name=\"LiveNodes\" id=\"title\">" + "Live Datanodes : "
@@ -934,8 +946,8 @@
 
             JspHelper.sortNodeList(live, sorterField, sorterOrder);
             for (int i = 0; i < live.size(); i++) {
-              generateNodeData(out, live.get(i), port_suffix, true, nnInfoPort,
-                  nnaddr, request.getScheme());
+              generateNodeData(out, live.get(i), port_suffix, true, nnHttpPort,
+                  nnaddr);
             }
           }
           out.print("</table>\n");
@@ -955,7 +967,7 @@
             JspHelper.sortNodeList(dead, sorterField, sorterOrder);
             for (int i = 0; i < dead.size(); i++) {
               generateNodeData(out, dead.get(i), port_suffix, false,
-                  nnInfoPort, nnaddr, request.getScheme());
+                  nnHttpPort, nnaddr);
             }
 
             out.print("</table>\n");
@@ -986,7 +998,7 @@
             JspHelper.sortNodeList(decommissioning, "name", "ASC");
             for (int i = 0; i < decommissioning.size(); i++) {
               generateDecommissioningNodeData(out, decommissioning.get(i),
-                  port_suffix, true, nnInfoPort, nnaddr, request.getScheme());
+                  port_suffix, true, nnHttpPort, nnaddr);
             }
             out.print("</table>\n");
           }
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeJsp.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeJsp.java
index 147d12e..ecd8bf7 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeJsp.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeJsp.java
@@ -61,10 +61,9 @@
     
     InetSocketAddress nnIpcAddress = cluster.getNameNode().getNameNodeAddress();
     InetSocketAddress nnHttpAddress = cluster.getNameNode().getHttpAddress();
-    String base = JspHelper.Url.url("http", cluster.getDataNodes().get(0)
-        .getDatanodeId());
-
-    URL url = new URL(base + "/"
+    int dnInfoPort = cluster.getDataNodes().get(0).getInfoPort();
+    
+    URL url = new URL("http://localhost:" + dnInfoPort + "/"
         + "browseDirectory.jsp" + JspHelper.getUrlParam("dir", 
             URLEncoder.encode(testPath.toString(), "UTF-8"), true)
         + JspHelper.getUrlParam("namenodeInfoPort", Integer
@@ -87,9 +86,6 @@
     // check whether able to 'Go Back to File View' after tailing the file
     regex = "<a.+href=\"(.+?)\">Go\\s*Back\\s*to\\s*File\\s*View\\<\\/a\\>";
     assertFileContents(regex, "Go Back to File View");
-
-    regex = "<a href=\"///localhost:" + nnHttpAddress.getPort() + "/dfshealth.jsp\">Go back to DFS home</a>";
-    assertTrue("page should generate DFS home scheme without explicit scheme", viewFilePage.contains(regex));
   }
   
   private static void assertFileContents(String regex, String text)
@@ -170,7 +166,6 @@
     Mockito.doReturn(NetUtils.getHostPortString(NameNode.getAddress(CONF)))
         .when(reqMock).getParameter("nnaddr");
     Mockito.doReturn(testFile.toString()).when(reqMock).getPathInfo();
-    Mockito.doReturn("http").when(reqMock).getScheme();
   }
 
   static Path writeFile(FileSystem fs, Path f) throws IOException {