web-dev-qa-db-fra.com

java.lang.IllegalArgumentException: caractère non valide trouvé dans le nom de la méthode. Les noms de méthodes HTTP doivent être des jetons.

J'obtiens une trace sous la pile lorsque je déploie mon application dans un environnement Apache Tomcat 8 multi-serveur. Je reçois fréquemment cette erreur et il semble que cela bloque le thread Tomcat:

INFO [http-nio-80-exec-4461] org.Apache.coyote.http11.AbstractHttp11Processor.process Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
 Java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
 at org.Apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.Java:233)
 at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1017)
 at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:684)
 at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1524)
 at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1480)
 at Java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
 at Java.lang.Thread.run(Unknown Source)

Quelqu'un peut-il me dire comment résoudre un problème ou restreindre une telle exception? Je ne reçois aucune référence à aucun de mes fichiers source d'application. J'ai essayé de google autour, et dans les liens qu'il a dit, vous essayez d'accéder à http url via https, ce qui semble peu probable. Je ne reçois pas cette erreur lorsque l'application s'exécute sur une seule instance de Tomcat 8. Je ne reçois cela que dans un environnement multi-serveur.

Je partage également les balises méta que j'ai intégrées à chaque page, si cela aide à identifier la cause.

<%
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "no-store");
    response.setDateHeader("Expires", 0);
    response.setHeader("Pragma", "no-cache");
%>


<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1">

J'utilise également les éléments suivants dans quelques pages, qui sont fondamentalement les mêmes que ci-dessus:

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Cache-Control" content="private" />
<meta http-equiv="Cache-Control" content="no-store" />
<meta http-equiv="Pragma" content="no-cache" />

Même si quelqu'un aide à donner une direction à ma tentative de dépannage, cela me sera utile, car je ne sais pas pour l'instant où chercher.

Merci d'avance.

64
user2016012

Cette exception peut se produire lorsque vous essayez d'exécuter une requête https depuis un client sur un noeud final sur lequel https n'est pas activé. Le client chiffrera les données de la demande lorsque le serveur attend des données brutes.

121
Petar Tonev

J'ai eu la même exception lorsque j'ai testé localement. Le problème était un schéma d'URL dans ma demande.

Changer https:// to http:// in your client url.

Ca aide probablement.

24
Dev4World

Vous appelez le serveur local avec http : // localhost: 8080/foo/bar. Appelez-le avec https : // localhost: 8080/foo/bar. Cela résout le problème

12
Shivan Sawant

J'ai reçu cette exception non liée à des problèmes de SSL. Dans mon cas, la valeur de l'en-tête Content-Length ne correspond pas à la longueur du corps.

2
mibollma

Répondre à cette ancienne question (pour les autres, cela peut aider)

Si vous configurez correctement votre httpd conf, le problème sera résolu. Installez n'importe quel serveur httpd, si vous n'en avez pas.

Liste de ma configuration ici.

[smilyface@box002 ~]$ cat /etc/httpd/conf/httpd.conf | grep shirts | grep -v "#"


        ProxyPass /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPassReverse /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPass /shirts http://local.box002.com:16443/shirts
        ProxyPassReverse /shirts http://local.box002.com:16443/shirts
        ...
        ...
        ...

éditez le fichier comme ci-dessus, puis redémarrez httpd comme ci-dessous

[smilyface@box002 ~]$ Sudo service httpd restart


Et ensuite, demander avec avec https fonctionnera sans exception.
Aussi, les requêtes avec http seront transmises à https! Pas de soucis.

1
smilyface

Il m'est arrivé lorsqu'un même port utilisé dans SOCKS sous tunnel ssh exécutait un proxy dans un port 8080 et que mon serveur et mon proxy de navigateur firefox étaient définis sur ce port et que ce problème était résolu. 

0
privatejava

J'obtenais la même exception chaque fois qu'une page était chargée, 

NFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
Java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
    at org.Apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.Java:139)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1028)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:637)
    at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:316)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1149)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:624)
    at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
    at Java.lang.Thread.run(Thread.Java:748)

J'ai trouvé que l'une des URL de ma page était https au lieu de http; quand j'ai changé, l'erreur était partie.

0
Asif Iquebal Ajazi

Cela se produit généralement lorsque vous utilisez un schéma URI qui n'est pas pris en charge par le serveur sur lequel l'application est déployée. Ainsi, vous pouvez soit vérifier quels schémas sont pris en charge par votre serveur et modifier votre requête URI en conséquence, soit ajouter le support de ce schéma sur votre serveur. La portée de votre application devrait vous aider à prendre une décision.

0
noob