HADOOP-7729. Merge r1183512 from trunk to 0.23
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1298085 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e4d3e2ffa3
commit
d667cd871b
|
@ -288,6 +288,9 @@ Release 0.23.1 - 2012-02-17
|
|||
|
||||
HADOOP-7470. Move up to Jackson 1.8.8. (Enis Soztutar via szetszwo)
|
||||
|
||||
HADOOP-7729. Send back valid HTTP response if user hits IPC port with
|
||||
HTTP GET. (todd)
|
||||
|
||||
HADOOP-8027. Visiting /jmx on the daemon web interfaces may print
|
||||
unnecessary error in logs. (atm)
|
||||
|
||||
|
|
|
@ -110,6 +110,23 @@ public abstract class Server {
|
|||
*/
|
||||
public static final ByteBuffer HEADER = ByteBuffer.wrap("hrpc".getBytes());
|
||||
|
||||
/**
|
||||
* If the user accidentally sends an HTTP GET to an IPC port, we detect this
|
||||
* and send back a nicer response.
|
||||
*/
|
||||
private static final ByteBuffer HTTP_GET_BYTES = ByteBuffer.wrap(
|
||||
"GET ".getBytes());
|
||||
|
||||
/**
|
||||
* An HTTP response to send back if we detect an HTTP request to our IPC
|
||||
* port.
|
||||
*/
|
||||
static final String RECEIVED_HTTP_REQ_RESPONSE =
|
||||
"HTTP/1.1 404 Not Found\r\n" +
|
||||
"Content-type: text/plain\r\n\r\n" +
|
||||
"It looks like you are making an HTTP request to a Hadoop IPC port. " +
|
||||
"This is not the correct port for the web interface on this daemon.\r\n";
|
||||
|
||||
// 1 : Introduce ping and server does not throw away RPCs
|
||||
// 3 : Introduce the protocol into the RPC connection header
|
||||
// 4 : Introduced SASL security layer
|
||||
|
@ -990,6 +1007,7 @@ public abstract class Server {
|
|||
private ByteArrayOutputStream authFailedResponse = new ByteArrayOutputStream();
|
||||
// Fake 'call' for SASL context setup
|
||||
private static final int SASL_CALLID = -33;
|
||||
|
||||
private final Call saslCall = new Call(SASL_CALLID, null, this);
|
||||
private final ByteArrayOutputStream saslResponse = new ByteArrayOutputStream();
|
||||
|
||||
|
@ -1237,6 +1255,15 @@ public abstract class Server {
|
|||
authMethod = AuthMethod.read(new DataInputStream(
|
||||
new ByteArrayInputStream(method)));
|
||||
dataLengthBuffer.flip();
|
||||
|
||||
// Check if it looks like the user is hitting an IPC port
|
||||
// with an HTTP GET - this is a common error, so we can
|
||||
// send back a simple string indicating as much.
|
||||
if (HTTP_GET_BYTES.equals(dataLengthBuffer)) {
|
||||
setupHttpRequestOnIpcPortResponse();
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!HEADER.equals(dataLengthBuffer) || version != CURRENT_VERSION) {
|
||||
//Warning is ok since this is not supposed to happen.
|
||||
LOG.warn("Incorrect header or version mismatch from " +
|
||||
|
@ -1356,6 +1383,13 @@ public abstract class Server {
|
|||
}
|
||||
}
|
||||
|
||||
private void setupHttpRequestOnIpcPortResponse() throws IOException {
|
||||
Call fakeCall = new Call(0, null, this);
|
||||
fakeCall.setResponse(ByteBuffer.wrap(
|
||||
RECEIVED_HTTP_REQ_RESPONSE.getBytes()));
|
||||
responder.doRespond(fakeCall);
|
||||
}
|
||||
|
||||
/// Reads the connection header following version
|
||||
private void processHeader(byte[] buf) throws IOException {
|
||||
DataInputStream in =
|
||||
|
|
|
@ -584,6 +584,12 @@ public class TestIPC {
|
|||
NetworkTraces.RESPONSE_TO_HADOOP_0_21_0_RPC);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHttpGetResponse() throws Exception {
|
||||
doIpcVersionTest("GET / HTTP/1.0\r\n\r\n".getBytes(),
|
||||
Server.RECEIVED_HTTP_REQ_RESPONSE.getBytes());
|
||||
}
|
||||
|
||||
private void doIpcVersionTest(
|
||||
byte[] requestData,
|
||||
byte[] expectedResponse) throws Exception {
|
||||
|
|
Loading…
Reference in New Issue