TikaJAXRS PUT от клиента Python

Apache Tika должен быть доступен из программы Python через HTTP, но я не могу заставить его работать.

Я использую эту команду для запуска сервера (с двумя опциями и без них в конце):

java -jar tika-server-1.17.jar --port 5677 -enableUnsecureFeatures -enableFileUrl

И это прекрасно работает с curl:

curl -v -T /tmp/tmpsojwBN  http://localhost:5677/tika
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 5677 (#0)
> PUT /tika HTTP/1.1
> Host: localhost:5677
> User-Agent: curl/7.47.0
> Accept: */*
> Accept-Encoding: gzip, deflate
> Content-Length: 418074
> Expect: 100-continue
> 
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Date: Sat, 07 Apr 2018 12:28:41 GMT
< Transfer-Encoding: chunked
< Server: Jetty(8.y.z-SNAPSHOT)

Но когда я пытаюсь что-то вроде (пробовал разные комбинации для заголовков, здесь я воссоздаю те же заголовки, что и клиент python-tika):

with tempfile.NamedTemporaryFile() as tmp_file:
    download_file(url, tmp_file)
    payload = open(tmp_file.name, 'rb')
    headers = {
        'Accept': 'application/json',
        'Content-Disposition': 'attachment; filename={}'.format(
            os.path.basename(tmp_file.name))}
    response = requests.put(TIKA_ENDPOINT_URL + '/tika', payload,
                            headers=headers,
                            verify=False)

Я пытался использовать полезную нагрузку, а также fileUrl - с тем же результатом WARN javax.ws.rs.ClientErrorException: HTTP 406 Not Acceptable и трассировка стека Java на сервере. Полный след:

WARN  javax.ws.rs.ClientErrorException: HTTP 406 Not Acceptable
    at org.apache.cxf.jaxrs.utils.SpecExceptions.toHttpException(SpecExceptions.java:117)
    at org.apache.cxf.jaxrs.utils.ExceptionUtils.toHttpException(ExceptionUtils.java:173)
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:542)
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:177)
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:77)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:274)
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:261)
    at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:76)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1088)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1024)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:973)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1035)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:641)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:748)

Я также пытался сравнить (с nc -l localhost 5677 | less) что же отличается от двух запросов (сокращенная полезная нагрузка):

Из завитка:

PUT /tika HTTP/1.1
Host: localhost:5677
User-Agent: curl/7.47.0
Accept: */*
Content-Length: 418074
Expect: 100-continue

%PDF-1.4
%<D3><EB><E9><E1>
1 0 obj
<</Creator (Chromium)

Из Python запрашивает библиотеку:

PUT /tika HTTP/1.1
Host: localhost:5677
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: application/json
User-Agent: python-requests/2.13.0
Content-type: application/pdf
Content-Length: 246176

%PDF-1.4
%<D3><EB><E9><E1>
1 0 obj
<</Creator (Chromium)

Вопрос в том, как правильно назвать сервер Tika из Python?

Я тоже пробовал питон tika библиотека в режиме только клиента и использование tika-app через jnius. С клиентом tika, а также с использованием tika-app.jar с pyjnius, я зависаю только (вызов не возвращается), когда я использую их в сельдерее. В то же время сценарий pyjnius / tika-app и tika-python прекрасно работают в сценарии: я не понял, что не так внутри работника сельдерея. Я думаю, что-то делать с многопоточностью и / или инициализацией в неправильном месте. Но это тема для другого вопроса.

А вот что просит tika-python:

PUT /tika HTTP/1.1
Host: localhost:5677
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: application/json
User-Agent: python-requests/2.13.0
Content-Disposition: attachment; filename=tmpb3YkTq
Content-Length: 183234

%PDF-1.4
%<D3><EB><E9><E1>
1 0 obj
<</Creator (Chromium)

И теперь кажется, что это какая-то проблема с сервером Тика:

$ tika-python --verbose --server 'localhost' --port 5677 parse all /tmp/tmpb3YkTq
2018-04-08 09:44:11,555 [MainThread  ] [INFO ]  Writing ./tmpb3YkTq_meta.json
(<open file '<stderr>', mode 'w' at 0x7f0b688eb1e0>, 'Request headers: ', {'Accept': 'application/json', 'Content-Disposition': 'attachment; filename=tmpb3YkTq'})
(<open file '<stderr>', mode 'w' at 0x7f0b688eb1e0>, 'Response headers: ', {'Date': 'Sun, 08 Apr 2018 06:44:13 GMT', 'Transfer-Encoding': 'chunked', 'Content-Type': 'application/json', 'Server': 'Jetty(8.y.z-SNAPSHOT)'})
['./tmpb3YkTq_meta.json']

Cf:

$ tika-python --verbose --server 'localhost' --port 5677 parse text /tmp/tmpb3YkTq
2018-04-08 09:43:38,326 [MainThread  ] [INFO ]  Writing ./tmpb3YkTq_meta.json
(<open file '<stderr>', mode 'w' at 0x7fc3eee4a1e0>, 'Request headers: ', {'Accept': 'application/json', 'Content-Disposition': 'attachment; filename=tmpb3YkTq'})
(<open file '<stderr>', mode 'w' at 0x7fc3eee4a1e0>, 'Response headers: ', {'Date': 'Sun, 08 Apr 2018 06:43:38 GMT', 'Content-Length': '0', 'Server': 'Jetty(8.y.z-SNAPSHOT)'})
2018-04-08 09:43:38,409 [MainThread  ] [WARNI]  Tika server returned status: 406
['./tmpb3YkTq_meta.json']

0 ответов

Другие вопросы по тегам