mirror of https://github.com/apache/lucene.git
SOLR-2813: Fix HTTP error codes returned when requests contain strings that can not be parsed as numbers for Trie fields
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1202499 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
67478264b5
commit
3508d03220
|
@ -428,6 +428,8 @@ Bug Fixes
|
||||||
* SOLR-2861: Fix extremely rare race condition on commit that can result
|
* SOLR-2861: Fix extremely rare race condition on commit that can result
|
||||||
in a NPE (yonik)
|
in a NPE (yonik)
|
||||||
|
|
||||||
|
* SOLR-2813: Fix HTTP error codes returned when requests contain strings that
|
||||||
|
can not be parsed as numbers for Trie fields. (Jeff Crump and hossman)
|
||||||
|
|
||||||
Other Changes
|
Other Changes
|
||||||
----------------------
|
----------------------
|
||||||
|
|
|
@ -89,24 +89,29 @@ final class TrieTokenizer extends Tokenizer {
|
||||||
this.startOfs = correctOffset(0);
|
this.startOfs = correctOffset(0);
|
||||||
this.endOfs = correctOffset(len);
|
this.endOfs = correctOffset(len);
|
||||||
String v = new String(buf, 0, len);
|
String v = new String(buf, 0, len);
|
||||||
switch (type) {
|
try {
|
||||||
case INTEGER:
|
switch (type) {
|
||||||
ts.setIntValue(Integer.parseInt(v));
|
case INTEGER:
|
||||||
break;
|
ts.setIntValue(Integer.parseInt(v));
|
||||||
case FLOAT:
|
break;
|
||||||
ts.setFloatValue(Float.parseFloat(v));
|
case FLOAT:
|
||||||
break;
|
ts.setFloatValue(Float.parseFloat(v));
|
||||||
case LONG:
|
break;
|
||||||
ts.setLongValue(Long.parseLong(v));
|
case LONG:
|
||||||
break;
|
ts.setLongValue(Long.parseLong(v));
|
||||||
case DOUBLE:
|
break;
|
||||||
ts.setDoubleValue(Double.parseDouble(v));
|
case DOUBLE:
|
||||||
break;
|
ts.setDoubleValue(Double.parseDouble(v));
|
||||||
case DATE:
|
break;
|
||||||
ts.setLongValue(dateField.parseMath(null, v).getTime());
|
case DATE:
|
||||||
break;
|
ts.setLongValue(dateField.parseMath(null, v).getTime());
|
||||||
default:
|
break;
|
||||||
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field");
|
default:
|
||||||
|
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field");
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException nfe) {
|
||||||
|
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
|
||||||
|
"Invalid Number: " + v);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unable to create TrieIndexTokenizer", e);
|
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unable to create TrieIndexTokenizer", e);
|
||||||
|
|
|
@ -22,6 +22,8 @@ import java.io.IOException;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
@ -222,6 +224,43 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testClientErrorOnMalformedNumbers() throws Exception {
|
||||||
|
|
||||||
|
final String BAD_VALUE = "NOT_A_NUMBER";
|
||||||
|
ignoreException(BAD_VALUE);
|
||||||
|
|
||||||
|
final List<String> FIELDS = new LinkedList<String>();
|
||||||
|
for (String type : new String[] { "ti", "tf", "td", "tl" }) {
|
||||||
|
FIELDS.add("malformed_" + type);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test that malformed numerics cause client error not server error
|
||||||
|
for (String field : FIELDS) {
|
||||||
|
try {
|
||||||
|
h.update(add( doc("id","100", field, BAD_VALUE)));
|
||||||
|
fail("Didn't encounter an error trying to add a non-number: " + field);
|
||||||
|
} catch (SolrException e) {
|
||||||
|
String msg = e.toString();
|
||||||
|
assertTrue("not an (update) client error on field: " + field +" : "+ msg,
|
||||||
|
400 <= e.code() && e.code() < 500);
|
||||||
|
assertTrue("(update) client error does not mention bad value: " + msg,
|
||||||
|
msg.contains(BAD_VALUE));
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
h.query(req("q",field + ":" + BAD_VALUE));
|
||||||
|
fail("Didn't encounter an error trying to query a non-number: " + field);
|
||||||
|
} catch (SolrException e) {
|
||||||
|
String msg = e.toString();
|
||||||
|
assertTrue("not a (search) client error on field: " + field +" : "+ msg,
|
||||||
|
400 <= e.code() && e.code() < 500);
|
||||||
|
assertTrue("(search) client error does not mention bad value: " + msg,
|
||||||
|
msg.contains(BAD_VALUE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRequestHandlerBaseException() {
|
public void testRequestHandlerBaseException() {
|
||||||
final String tmp = "BOO! ignore_exception";
|
final String tmp = "BOO! ignore_exception";
|
||||||
|
|
Loading…
Reference in New Issue