Zatvobor/tirexs

delete elasticsearch error

haslinger opened this issue · 8 comments

While get
Tirexs.HTTP.get("/panoptikum_dev/personas/4083/")
and queries work nicely for me (thanks for the great work!), i struggle with deleting:
Tirexs.HTTP.delete!("/panoptikum_dev/personas/4083/")

The error in elasticsearch 5.3.0 tells me:

[2017-03-30T13:53:38,735][WARN ][o.e.h.n.Netty4HttpServerTransport] [Yo-gtFL] caught exception while handling client http traffic, closing connection [id: 0xc3f0cd06, L:/127.0.0.1:9200 - R:/127.0.0.1:37007]
java.lang.IllegalArgumentException: invalid Content-Type header []
	at org.elasticsearch.rest.RestRequest.parseContentType(RestRequest.java:492) ~[elasticsearch-5.3.0.jar:5.3.0]
	at org.elasticsearch.rest.RestRequest.<init>(RestRequest.java:88) ~[elasticsearch-5.3.0.jar:5.3.0]
	at org.elasticsearch.http.netty4.Netty4HttpRequest.<init>(Netty4HttpRequest.java:49) ~[transport-netty4-5.3.0.jar:5.3.0]
	at org.elasticsearch.http.netty4.Netty4HttpRequestHandler.channelRead0(Netty4HttpRequestHandler.java:67) ~[transport-netty4-5.3.0.jar:5.3.0]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) ~[netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at org.elasticsearch.http.netty4.pipelining.HttpPipeliningHandler.channelRead(HttpPipeliningHandler.java:63) [transport-netty4-5.3.0.jar:5.3.0]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at org.elasticsearch.http.netty4.cors.Netty4CorsHandler.channelRead(Netty4CorsHandler.java:76) [transport-netty4-5.3.0.jar:5.3.0]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) [netty-codec-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293) [netty-codec-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267) [netty-codec-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:129) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:642) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:527) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:481) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:441) [netty-transport-4.1.7.Final.jar:4.1.7.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [netty-common-4.1.7.Final.jar:4.1.7.Final]
	at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]

am I doing something wrong here?
Any hints appreciated!

Update: I could delete via curl
curl -XDELETE http://localhost:9200/panoptikum_dev/personas/4083/

Hi @haslinger. I think for elastic 5.3.0 we don't need send any headers. so, you can try check Tirexs.HTTP.delete! and remove headers

Currently no luck, tried with
:delete -> ( request(method, {url, []}, [], []) |> response() )
tried to get old elasticsearch behaviour by setting
http.content_type.required: true

I have the strange feeling, that the error message
invalid Content-Type header []
indicates, that the content type is not sent as specified, but overwritten with a "[]" string or so somewhere.

Have to investigate further...

Eureka! I found a (weird) way, that works from within elixir:
:httpc.request(:delete, {'http://localhost:9200/panoptikum_dev/personas/921', [], 'application/json', ""}, [], [])
so providing an empty-string body helped. I believe, that elastic's auto detection is somehow broken.

IN IEX:

iex(70)> get("/test/users/AVs91cX8gmVkMe6i2NtC")
{:ok, 200,
 %{_id: "AVs91cX8gmVkMe6i2NtC", _index: "test",
   _source: %{email: "1190000008944122@example.com", name: "1190000008944122"},
   _type: "users", _version: 1, found: true}}

iex(71)> delete!("/test/users/AVs91cX8gmVkMe6i2NtC")            
** (FunctionClauseError) no function clause matching in Tirexs.HTTP.ok!/1
    (tirexs) lib/tirexs/http.ex:320: Tirexs.HTTP.ok!(:error)

CURL is OK

➜ curl -XDELETE 'localhost:9200/test/users/AVs91cX8gmVkMe6i2NtC' -H'Content-Type: application/json' 
{"found":true,"_index":"test","_type":"users","_id":"AVs91cX8gmVkMe6i2NtC","_version":2,"result":"deleted","_shards":{"total":2,"successful":1,"failed":0}}#  

@haslinger take a look at 2d708f5 commit, does it work for you?

No, that finally creates a request in the form of
:httpc.request(:delete, {'http://127.0.0.1:9200/panoptikum_dev/categories/14', [{'Content-Type', 'application/json'}]}, 'application/json', [])
instead of
:httpc.request(:delete, {'http://127.0.0.1:9200/panoptikum_dev/categories/14', [], 'application/json', ""}, [], [])

So the line should be
:delete -> ( request(method, {url, headers, content_type, []}, [], []) |> response() )
instead of your suggestion
:delete -> ( request(method, {url, headers}, content_type, []) |> response() )

@haslinger Ohh, I see, it's my fault... The recent commit is actually what you're looking for...

Yes! That works!