26
26
import java .security .NoSuchAlgorithmException ;
27
27
import java .text .ParseException ;
28
28
import java .util .ArrayList ;
29
+ import java .util .Arrays ;
29
30
import java .util .Collections ;
30
31
import java .util .Date ;
31
32
import java .util .HashMap ;
104
105
105
106
public class PlayHandler extends SimpleChannelUpstreamHandler {
106
107
108
+
109
+
110
+ private static final String X_HTTP_METHOD_OVERRIDE = "X-HTTP-Method-Override" ;
111
+
107
112
/**
108
113
* If true (the default), Play will send the HTTP header
109
114
* "Server: Play! Framework; ....". This could be a security problem (old
@@ -124,6 +129,15 @@ public class PlayHandler extends SimpleChannelUpstreamHandler {
124
129
125
130
private WebSocketServerHandshaker handshaker ;
126
131
132
+
133
+ /**
134
+ * Define allowed methods that will be handled when defined in X-HTTP-Method-Override
135
+ * You can define allowed method in
136
+ * application.conf: <code>http.allowed.method.override=POST,PUT</code>
137
+ */
138
+ private static final List <String > allowedHttpMethodOverride = Arrays .asList (Play .configuration .getProperty ("http.allowed.method.override" , "" ).split ("," ));
139
+
140
+
127
141
static {
128
142
try {
129
143
SHA_1 = MessageDigest .getInstance ("SHA1" );
@@ -598,8 +612,9 @@ public Request parseRequest(ChannelHandlerContext ctx, HttpRequest nettyRequest,
598
612
String remoteAddress = getRemoteIPAddress (messageEvent );
599
613
String method = nettyRequest .getMethod ().getName ();
600
614
601
- if (nettyRequest .headers ().get ("X-HTTP-Method-Override" ) != null ) {
602
- method = nettyRequest .headers ().get ("X-HTTP-Method-Override" ).intern ();
615
+ if (nettyRequest .headers ().get (X_HTTP_METHOD_OVERRIDE ) != null
616
+ && allowedHttpMethodOverride .contains (nettyRequest .headers ().get (X_HTTP_METHOD_OVERRIDE ).intern ())) {
617
+ method = nettyRequest .headers ().get (X_HTTP_METHOD_OVERRIDE ).intern ();
603
618
}
604
619
605
620
InputStream body = null ;
0 commit comments