Skip to content

Commit 1b497d8

Browse files
committed
move RestRequest to be an abstract class, and expose local/remote address
1 parent 85f5f98 commit 1b497d8

File tree

5 files changed

+129
-149
lines changed

5 files changed

+129
-149
lines changed

src/main/java/org/elasticsearch/http/HttpRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@
2424
/**
2525
*
2626
*/
27-
public interface HttpRequest extends RestRequest {
27+
public abstract class HttpRequest extends RestRequest {
2828

2929
}

src/main/java/org/elasticsearch/http/netty/HttpRequestHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Ex
4040
HttpRequest request = (HttpRequest) e.getMessage();
4141
// the netty HTTP handling always copy over the buffer to its own buffer, either in NioWorker internally
4242
// when reading, or using a cumalation buffer
43-
serverTransport.dispatchRequest(new NettyHttpRequest(request), new NettyHttpChannel(serverTransport, e.getChannel(), request));
43+
serverTransport.dispatchRequest(new NettyHttpRequest(request, e.getChannel()), new NettyHttpChannel(serverTransport, e.getChannel(), request));
4444
super.messageReceived(ctx, e);
4545
}
4646

src/main/java/org/elasticsearch/http/netty/NettyHttpRequest.java

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,28 +23,28 @@
2323
import org.elasticsearch.common.bytes.BytesReference;
2424
import org.elasticsearch.common.bytes.ChannelBufferBytesReference;
2525
import org.elasticsearch.http.HttpRequest;
26-
import org.elasticsearch.rest.support.AbstractRestRequest;
2726
import org.elasticsearch.rest.support.RestUtils;
27+
import org.jboss.netty.channel.Channel;
2828
import org.jboss.netty.handler.codec.http.HttpMethod;
2929

30+
import java.net.SocketAddress;
3031
import java.util.HashMap;
3132
import java.util.Map;
3233

3334
/**
3435
*
3536
*/
36-
public class NettyHttpRequest extends AbstractRestRequest implements HttpRequest {
37+
public class NettyHttpRequest extends HttpRequest {
3738

3839
private final org.jboss.netty.handler.codec.http.HttpRequest request;
39-
40+
private final Channel channel;
4041
private final Map<String, String> params;
41-
4242
private final String rawPath;
43-
4443
private final BytesReference content;
4544

46-
public NettyHttpRequest(org.jboss.netty.handler.codec.http.HttpRequest request) {
45+
public NettyHttpRequest(org.jboss.netty.handler.codec.http.HttpRequest request, Channel channel) {
4746
this.request = request;
47+
this.channel = channel;
4848
this.params = new HashMap<String, String>();
4949
if (request.getContent().readable()) {
5050
this.content = new ChannelBufferBytesReference(request.getContent());
@@ -119,11 +119,38 @@ public BytesReference content() {
119119
return content;
120120
}
121121

122+
/**
123+
* Returns the remote address where this rest request channel is "connected to". The
124+
* returned {@link SocketAddress} is supposed to be down-cast into more
125+
* concrete type such as {@link java.net.InetSocketAddress} to retrieve
126+
* the detailed information.
127+
*/
128+
@Override
129+
public SocketAddress getRemoteAddress() {
130+
return channel.getRemoteAddress();
131+
}
132+
133+
/**
134+
* Returns the local address where this request channel is bound to. The returned
135+
* {@link SocketAddress} is supposed to be down-cast into more concrete
136+
* type such as {@link java.net.InetSocketAddress} to retrieve the detailed
137+
* information.
138+
*/
139+
@Override
140+
public SocketAddress getLocalAddress() {
141+
return channel.getLocalAddress();
142+
}
143+
122144
@Override
123145
public String header(String name) {
124146
return request.headers().get(name);
125147
}
126148

149+
@Override
150+
public Iterable<Map.Entry<String, String>> headers() {
151+
return request.headers().entries();
152+
}
153+
127154
@Override
128155
public boolean hasParam(String key) {
129156
return params.containsKey(key);
@@ -142,10 +169,4 @@ public String param(String key, String defaultValue) {
142169
}
143170
return value;
144171
}
145-
146-
@Override
147-
public Iterable<Map.Entry<String, String>> headers() {
148-
return request.headers().entries();
149-
}
150-
151172
}

src/main/java/org/elasticsearch/rest/RestRequest.java

Lines changed: 94 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,71 +19,143 @@
1919

2020
package org.elasticsearch.rest;
2121

22+
import org.elasticsearch.ElasticSearchIllegalArgumentException;
23+
import org.elasticsearch.common.Booleans;
24+
import org.elasticsearch.common.Nullable;
25+
import org.elasticsearch.common.Strings;
2226
import org.elasticsearch.common.bytes.BytesReference;
2327
import org.elasticsearch.common.unit.ByteSizeValue;
2428
import org.elasticsearch.common.unit.TimeValue;
2529
import org.elasticsearch.common.xcontent.ToXContent;
30+
import org.elasticsearch.rest.support.RestUtils;
2631

32+
import java.net.SocketAddress;
2733
import java.util.Map;
2834

35+
import static org.elasticsearch.common.unit.ByteSizeValue.parseBytesSizeValue;
36+
import static org.elasticsearch.common.unit.TimeValue.parseTimeValue;
37+
2938
/**
3039
*
3140
*/
32-
public interface RestRequest extends ToXContent.Params {
41+
public abstract class RestRequest implements ToXContent.Params {
3342

34-
enum Method {
43+
public enum Method {
3544
GET, POST, PUT, DELETE, OPTIONS, HEAD
3645
}
3746

38-
Method method();
47+
public abstract Method method();
3948

4049
/**
4150
* The uri of the rest request, with the query string.
4251
*/
43-
String uri();
52+
public abstract String uri();
4453

4554
/**
4655
* The non decoded, raw path provided.
4756
*/
48-
String rawPath();
57+
public abstract String rawPath();
4958

5059
/**
5160
* The path part of the URI (without the query string), decoded.
5261
*/
53-
String path();
62+
public final String path() {
63+
return RestUtils.decodeComponent(rawPath());
64+
}
5465

55-
boolean hasContent();
66+
public abstract boolean hasContent();
5667

5768
/**
5869
* Is the byte array content safe or unsafe for usage on other threads
5970
*/
60-
boolean contentUnsafe();
71+
public abstract boolean contentUnsafe();
6172

62-
BytesReference content();
73+
public abstract BytesReference content();
6374

64-
String header(String name);
75+
public abstract String header(String name);
6576

66-
boolean hasParam(String key);
77+
public abstract Iterable<Map.Entry<String, String>> headers();
6778

68-
String param(String key);
79+
@Nullable
80+
public SocketAddress getRemoteAddress() {
81+
return null;
82+
}
6983

70-
String[] paramAsStringArray(String key, String[] defaultValue);
84+
@Nullable
85+
public SocketAddress getLocalAddress() {
86+
return null;
87+
}
7188

72-
float paramAsFloat(String key, float defaultValue);
89+
public abstract boolean hasParam(String key);
7390

74-
int paramAsInt(String key, int defaultValue);
91+
@Override
92+
public abstract String param(String key);
93+
94+
public abstract Map<String, String> params();
95+
96+
public float paramAsFloat(String key, float defaultValue) {
97+
String sValue = param(key);
98+
if (sValue == null) {
99+
return defaultValue;
100+
}
101+
try {
102+
return Float.parseFloat(sValue);
103+
} catch (NumberFormatException e) {
104+
throw new ElasticSearchIllegalArgumentException("Failed to parse float parameter [" + key + "] with value [" + sValue + "]", e);
105+
}
106+
}
75107

76-
long paramAsLong(String key, long defaultValue);
108+
public int paramAsInt(String key, int defaultValue) {
109+
String sValue = param(key);
110+
if (sValue == null) {
111+
return defaultValue;
112+
}
113+
try {
114+
return Integer.parseInt(sValue);
115+
} catch (NumberFormatException e) {
116+
throw new ElasticSearchIllegalArgumentException("Failed to parse int parameter [" + key + "] with value [" + sValue + "]", e);
117+
}
118+
}
77119

78-
boolean paramAsBoolean(String key, boolean defaultValue);
120+
public long paramAsLong(String key, long defaultValue) {
121+
String sValue = param(key);
122+
if (sValue == null) {
123+
return defaultValue;
124+
}
125+
try {
126+
return Long.parseLong(sValue);
127+
} catch (NumberFormatException e) {
128+
throw new ElasticSearchIllegalArgumentException("Failed to parse int parameter [" + key + "] with value [" + sValue + "]", e);
129+
}
130+
}
79131

80-
Boolean paramAsBooleanOptional(String key, Boolean defaultValue);
132+
@Override
133+
public boolean paramAsBoolean(String key, boolean defaultValue) {
134+
return Booleans.parseBoolean(param(key), defaultValue);
135+
}
81136

82-
TimeValue paramAsTime(String key, TimeValue defaultValue);
137+
@Override
138+
public Boolean paramAsBooleanOptional(String key, Boolean defaultValue) {
139+
String sValue = param(key);
140+
if (sValue == null) {
141+
return defaultValue;
142+
}
143+
return !(sValue.equals("false") || sValue.equals("0") || sValue.equals("off"));
144+
}
83145

84-
ByteSizeValue paramAsSize(String key, ByteSizeValue defaultValue);
146+
public TimeValue paramAsTime(String key, TimeValue defaultValue) {
147+
return parseTimeValue(param(key), defaultValue);
148+
}
85149

86-
Map<String, String> params();
150+
public ByteSizeValue paramAsSize(String key, ByteSizeValue defaultValue) {
151+
return parseBytesSizeValue(param(key), defaultValue);
152+
}
87153

88-
Iterable<Map.Entry<String, String>> headers();
154+
public String[] paramAsStringArray(String key, String[] defaultValue) {
155+
String value = param(key);
156+
if (value == null) {
157+
return defaultValue;
158+
}
159+
return Strings.splitStringByCommaToArray(value);
160+
}
89161
}

src/main/java/org/elasticsearch/rest/support/AbstractRestRequest.java

Lines changed: 0 additions & 113 deletions
This file was deleted.

0 commit comments

Comments
 (0)