Hello everybody.
Thanks all for your kind support.
Daniel Myung was absolutely right, Nginx is not compatible with chunked
encoding. You can read here
http://www.lamnk.com/blog/computer/fix-nginx-411-length-required-error/ if
you are curious.
Anyway, we "bypassed" Nginx and sent data directly to Tomcat in this case.
After solving this issue I ran into 3 o 4 problems maybe, but that does not
matter anymore. Right now Xforms seem to be arriving to OpenMRS, better
said: they at least reach the XformDataUploadManager.processXform(...)method from Xforms module, but then I get the following in OpenMRS's log:
ERROR - XformsUtil.reportDataUploadError(615) |2011-01-08 04:13:16,249|
null
java.lang.NullPointerException
at org.apache.commons.io.IOUtils.toInputStream(IOUtils.java:612)
at
org.openmrs.module.xforms.download.XformDataUploadManager.processXform(XformDataUploadManager.java:88)
at
org.openmrs.module.xforms.web.XformDataUploadServlet.doGet(XformDataUploadServlet.java:79)
at
org.openmrs.module.xforms.web.XformDataUploadServlet.doPost(XformDataUploadServlet.java:41)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
It refers to line 88 of XformDataUploadManager where we have:
public static void processXform(String xml, String sessionId,
String enterer, boolean propagateErrors,HttpServletRequest request) throws
Exception{
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc =
db.parse(IOUtils.toInputStream(xml,XformConstants.DEFAULT_CHARACTER_ENCODING));
setHeaderValues(doc,sessionId,enterer);
queueForm(XformsUtil.doc2String(doc),propagateErrors,request);
}
I have commons-io-1.4.jar, if that's useful to know.
This is shown in ODKVoice's log after a call is completed:
2011-01-08 04:13:16,209 INFO FormVxmlRenderer:317 - Set outbound status:
id=80; status=COMPLETE
Do not know how to handle preloader [patient]
Do not know how to handle preloader [patient]
Do not know how to handle preloader [patient]
2011-01-08 04:13:16,211 INFO FormVxmlRenderer:760 - Export data path:
/root/odkvoicedata/instances/+50588367336/1294470742015
2011-01-08 04:13:16,212 INFO FormVxmlRenderer:764 - XML path:
/root/odkvoicedata/instances/+50588367336/1294470742015/1294470742015.xml
Path:
/root/odkvoicedata/instances/+50588367336/1294470742015/1294470742015.xml
2011-01-08 04:13:16,213 INFO FormVxmlRenderer:784 - Queued
InstanceUploaderThread
2011-01-08 04:13:16,214 INFO FormVxmlRenderer:802 - About to upload
instance to
http://localhost:8080/openmrs_devel/moduleServlet/xforms/xformDataUpload?
uname=xxxxxx&pw=xxxxxx
2011-01-08 04:13:16,219 DEBUG SingleClientConnManager:195 - Get connection
for route HttpRoute[{}->http://localhost:8080]
2011-01-08 04:13:16,220 DEBUG ClientParamsStack:215 -
'http.connection.timeout': 50000
2011-01-08 04:13:16,220 DEBUG ClientParamsStack:215 -
'http.socket.timeout': 50000
2011-01-08 04:13:16,221 DEBUG RequestAddCookies:131 - CookieSpec selected:
best-match
2011-01-08 04:13:16,222 DEBUG DefaultRequestDirector:445 - Attempt 1 to
execute request
2011-01-08 04:13:16,222 DEBUG DefaultClientConnection:244 - Sending
request: POST
/openmrs_devel/moduleServlet/xforms/xformDataUpload?uname=xxxxxx&pw=xxxxxxHTTP/1.1
2011-01-08 04:13:16,222 DEBUG wire:78 - >> "POST
/openmrs_devel/moduleServlet/xforms/xformDataUpload?uname=xxxxxx&pw=xxxxxxHTTP/1.1
[EOL]"
2011-01-08 04:13:16,222 DEBUG wire:78 - >> "Transfer-Encoding:
chunked[EOL]"
2011-01-08 04:13:16,222 DEBUG wire:78 - >> "Content-Type:
multipart/form-data; boundary=92mV1yLtiBklUVxQhHi0-Oc2ALeAAlTogyfLlzL[EOL]"
2011-01-08 04:13:16,222 DEBUG wire:78 - >> "Host: localhost:8080[EOL]"
2011-01-08 04:13:16,223 DEBUG wire:78 - >> "Connection: Keep-Alive[EOL]"
2011-01-08 04:13:16,223 DEBUG wire:78 - >> "[EOL]"
2011-01-08 04:13:16,223 DEBUG headers:248 - >> POST
/openmrs_devel/moduleServlet/xforms/xformDataUpload?uname=xxxxxx&pw=xxxxxxHTTP/1.1
2011-01-08 04:13:16,223 DEBUG headers:251 - >> Transfer-Encoding: chunked
2011-01-08 04:13:16,223 DEBUG headers:251 - >> Content-Type:
multipart/form-data; boundary=92mV1yLtiBklUVxQhHi0-Oc2ALeAAlTogyfLlzL
2011-01-08 04:13:16,223 DEBUG headers:251 - >> Host: localhost:8080
2011-01-08 04:13:16,224 DEBUG headers:251 - >> Connection: Keep-Alive
2011-01-08 04:13:16,224 DEBUG wire:78 - >> "d2d[EOL]"
2011-01-08 04:13:16,224 DEBUG wire:64 - >>
"--92mV1yLtiBklUVxQhHi0-Oc2ALeAAlTogyfLlzL[\r][\n]"
2011-01-08 04:13:16,224 DEBUG wire:64 - >> "Content-Disposition: form-data;
name="xml_submission_file"; filename="text/xml"[\r][\n]"
2011-01-08 04:13:16,224 DEBUG wire:64 - >> "Content-Type:
application/octet-stream[\r][\n]"
2011-01-08 04:13:16,225 DEBUG wire:64 - >> "Content-Transfer-Encoding:
binary[\r][\n]"
2011-01-08 04:13:16,225 DEBUG wire:64 - >> "[\r][\n]"
2011-01-08 04:13:16,227 DEBUG wire:78 - >> "<?xml version='1.0' ?><date_entered /><patient.given_name
openmrs_table="patient_name"
openmrs_attribute="given_name">Juan</patient.given_name><patient.family_name
openmrs_table="patient_name"
openmrs_attribute="family_name">Prueba</patient.family_name><patient.patient_id
openmrs_table="patient"
openmrs_attribute="patient_id">4</patient.patient_id><patient.given_name_1
openmrs_table="patient_name"
openmrs_attribute="given_name">Juan</patient.given_name_1><patient.family_name_1
openmrs_table="patient_name"
openmrs_attribute="family_name">Rodriguez</patient.family_name_1><encounter.encounter_datetime
openmrs_table="encounter"
openmrs_attribute="encounter_datetime">2011-01-07</encounter.encounter_datetime><encounter.location_id
openmrs_table="encounter"
openmrs_attribute="location_id">1</encounter.location_id><encounter.provider_id
openmrs_table="encounter"
openmrs_attribute="provider_id">20</encounter.provider_id><confirmacion_de_identidad
openmrs_concept="6100^confirmacion de identidad^99DCT"
openmrs_datatype="ST">1</confirmacion_de_identidad><confirmacion_dia_de_cumpleanos
openmrs_concept="6101^confirmacion dia de cumpleanos^99DCT"
openmrs_datatype="ST">1</confirmacion_dia_de_cumpleanos><fecha_de_cita
openmrs_concept="6130^fecha de cita^99DCT" openmrs_datatype="DT">2010-03-03</fecha_de_cita><hora_de_cita
openmrs_concept="6129^hora de cita^99DCT" openmrs_datatype="TM"></hora_de_cita><confirmacion_hora_para_definir_diabetes
openmrs_concept="6102^confirmacion hora para definir diabetes^99DCT"
openmrs_datatype="ST">1</confirmacion_hora_para_definir_diabetes>"
2011-01-08 04:13:16,227 DEBUG wire:78 - >> "[EOL]"
2011-01-08 04:13:16,227 DEBUG wire:78 - >> "2f[EOL]"
2011-01-08 04:13:16,228 DEBUG wire:64 - >> "[\r][\n]"
2011-01-08 04:13:16,228 DEBUG wire:64 - >>
"--92mV1yLtiBklUVxQhHi0-Oc2ALeAAlTogyfLlzL--[\r][\n]"
2011-01-08 04:13:16,228 DEBUG wire:78 - >> "[EOL]"
2011-01-08 04:13:16,228 DEBUG wire:78 - >> "0[EOL]"
2011-01-08 04:13:16,228 DEBUG wire:78 - >> "[EOL]"
Any ideas? tips? I am stuck here now.
Thanks in advance.
Pavel Stephan Muñoz
SSI
---------- Forwarded message ----------
From: Daniel Myung dmyung@dimagi.com
Date: Wed, Dec 29, 2010 at 11:31 AM
Subject: Re: [ODK Community] "HTTP/1.1 411 Length Required" when
trying to push a XForm to OpenMRS from ODKVoice via HTTP-POST
To: opendatakit opendatakit@googlegroups.com
Hi all,
ODK along with other OpenROSA submissions transports in chunked
encoding as part of the header, as per the HTTP 1.1 spec.
From what I gather, Nginx out of the box does not support or honor the
chunked encoding header and fails hard when a content-length header is
not present in an HTTP POST as ODK submits. The 411 error is the
telltale sign of this error.
I personally ran into this and tried to remedy by using a later
version of nginx (> 0.8.35)
*) Feature: the "chunked_transfer_encoding" directive.
However, I could not get it to work. I even tried a few workarounds
with different combination of proxy buffering and the like.
The remedy I've seen online but haven't tried personally is to use the
Chunkin Module which requires rebuilding nginx from source:
http://wiki.nginx.org/HttpChunkinModule
Ultimately, this was an issue we had to work around. The current
workaround we use is having all submissions go through apache2 with
mod_proxy. We proxy all posts from port 80 (or 443) on submission, to
a separate internal port (port 81), but add the mod_proxy
environmental variable SetEnv SendCL 1
(see
http://www.atnan.com/2008/8/8/transfer-encoding-chunked-chunky-http)
Assuming you can get the POST working with nginx, there is potentially
another problem to contend with. On the return 201 message, that too
may cause a 411 error if there is any body in the 201 response. You
may also need to explicitly set a content length on the response even
it if it is zero or non zero.
Hope this helps,
Dan
On Wed, Dec 29, 2010 at 12:15 AM, Pavel Stephan Muñoz minibota@gmail.com wrote:
Hello masters ;),
I have set ODKVoice to upload Xforms to our OpenMRS deployment after
each
call is ended. I did so by editing the UPLOAD_URL string in the
constants/GlobalConstants class. According to this (from the xforms
module)
http://wiki.openmrs.org/display/docs/XForms+Module+External+Applications+Guide
we have two possible URLs to use:
http://server:8080/openmrs/moduleServlet/xforms/xformDataUpload?uname=name&pw=password
http://server:8080/openmrs/module/xforms/xformDataUpload.form?uname=name&pw=password
I have tried both options but we are getting a strange error in our
tomcat's
log. It says: HTTP/1.1 411 Length Required[EOL].
Sounds like ODKVoice is not creating proper HTTP headers for this
transaction; I mean "sounds like", but I doubt it. Other idea I have
about
possible causes: our tomcat is behind a nginx web server...
Can you bring us a light, as you always do? I am pasting the log here,
so
you can check.
Thank you all.
Pavel Stephan Muñoz.
2010-12-28 22:27:02,336 DEBUG DefaultClientConnection:244 - Sending
request:
POST
/openmrs_devel/moduleServlet/xforms/xformDataUpload.form?uname=pmunoz&pw=xxxxxxxx
HTTP/1.1
2010-12-28 22:27:02,336 DEBUG wire:78 - >> "POST
/openmrs_devel/moduleServlet/xforms/xformDataUpload.form?uname=pmunoz&pw=xxxxxxxx
HTTP/1.1[EOL]"
2010-12-28 22:27:02,336 DEBUG wire:78 - >> "Transfer-Encoding:
chunked[EOL]"
2010-12-28 22:27:02,342 DEBUG wire:78 - >> "Content-Type:
multipart/form-data; boundary=V4Nt2YzJfsuLt20b3zCWi3TuqUrBH6bXqMf[EOL]"
2010-12-28 22:27:02,342 DEBUG wire:78 - >> "Host: ehs.hopto.org[EOL]"
2010-12-28 22:27:02,342 DEBUG wire:78 - >> "Connection: Keep-Alive[EOL]"
2010-12-28 22:27:02,342 DEBUG wire:78 - >> "[EOL]"
2010-12-28 22:27:02,342 DEBUG headers:248 - >> POST
/openmrs_devel/moduleServlet/xforms/xformDataUpload.form?uname=pmunoz&pw=xxxxxxxx
HTTP/1.1
2010-12-28 22:27:02,342 DEBUG headers:251 - >> Transfer-Encoding:
chunked
2010-12-28 22:27:02,342 DEBUG headers:251 - >> Content-Type:
multipart/form-data; boundary=V4Nt2YzJfsuLt20b3zCWi3TuqUrBH6bXqMf
2010-12-28 22:27:02,342 DEBUG headers:251 - >> Host: ehs.hopto.org
2010-12-28 22:27:02,343 DEBUG headers:251 - >> Connection: Keep-Alive
2010-12-28 22:27:02,352 DEBUG wire:78 - >> "66c[EOL]"
2010-12-28 22:27:02,353 DEBUG wire:64 - >>
"--V4Nt2YzJfsuLt20b3zCWi3TuqUrBH6bXqMf[\r][\n]"
2010-12-28 22:27:02,353 DEBUG wire:64 - >> "Content-Disposition:
form-data;
name="xml_submission_file"; filename="text/xml"[\r][\n]"
2010-12-28 22:27:02,353 DEBUG wire:64 - >> "Content-Type:
application/octet-stream[\r][\n]"
2010-12-28 22:27:02,353 DEBUG wire:64 - >> "Content-Transfer-Encoding:
binary[\r][\n]"
2010-12-28 22:27:02,354 DEBUG wire:64 - >> "[\r][\n]"
2010-12-28 22:27:02,354 DEBUG wire:78 - >> "<?xml version='1.0' ?><date_entered
/><patient.family_name
openmrs_table="patient_name" openmrs_attribute="family_name"
/><patient.given_name openmrs_table="patient_name"
openmrs_attribute="given_name" /><patient.patient_id
openmrs_table="patient"
openmrs_attribute="patient_id"
/><encounter.encounter_datetime
openmrs_table="encounter" openmrs_attribute="encounter_datetime"
/><encounter.location_id openmrs_table="encounter"
openmrs_attribute="location_id">1</encounter.location_id><encounter.provider_id
openmrs_table="encounter"
openmrs_attribute="provider_id">1</encounter.provider_id><obs
openmrs_concept="1238^MEDICAL RECORD OBSERVATIONS^99DCT"
openmrs_datatype="ZZ"><confirmacion_hora_para_definir_diabetes
openmrs_concept="6102^confirmacion hora para definir diabetes^99DCT"
openmrs_datatype="NM">2</confirmacion_hora_para_definir_diabetes>"
2010-12-28 22:27:02,356 DEBUG wire:78 - >> "[EOL]"
2010-12-28 22:27:02,356 DEBUG wire:78 - >> "2b[EOL]"
2010-12-28 22:27:02,356 DEBUG wire:64 - >> "[\r][\n]"
2010-12-28 22:27:02,357 DEBUG wire:64 - >>
"--V4Nt2YzJfsuLt20b3zCWi3TuqUrBH6bXqMf--[\r][\n]"
2010-12-28 22:27:02,357 DEBUG wire:78 - >> "[EOL]"
2010-12-28 22:27:02,357 DEBUG wire:78 - >> "0[EOL]"
2010-12-28 22:27:02,357 DEBUG wire:78 - >> "[EOL]"
2010-12-28 22:27:02,358 DEBUG wire:78 - << "HTTP/1.1 411 Length
Required[EOL]"
2010-12-28 22:27:02,358 DEBUG wire:78 - << "Server: nginx/0.7.65[EOL]"
2010-12-28 22:27:02,358 DEBUG wire:78 - << "Date: Wed, 29 Dec 2010
01:27:13
GMT[EOL]"
2010-12-28 22:27:02,358 DEBUG wire:78 - << "Content-Type:
text/html[EOL]"
2010-12-28 22:27:02,358 DEBUG wire:78 - << "Content-Length: 181[EOL]"
2010-12-28 22:27:02,358 DEBUG wire:78 - << "Connection: close[EOL]"
2010-12-28 22:27:02,358 DEBUG wire:78 - << "[EOL]"
2010-12-28 22:27:02,359 DEBUG DefaultClientConnection:229 - Receiving
response: HTTP/1.1 411 Length Required
2010-12-28 22:27:02,359 DEBUG headers:232 - << HTTP/1.1 411 Length
Required
2010-12-28 22:27:02,359 DEBUG headers:235 - << Server: nginx/0.7.65
2010-12-28 22:27:02,359 DEBUG headers:235 - << Date: Wed, 29 Dec 2010
01:27:13 GMT
2010-12-28 22:27:02,359 DEBUG headers:235 - << Content-Type: text/html
2010-12-28 22:27:02,359 DEBUG headers:235 - << Content-Length: 181
2010-12-28 22:27:02,359 DEBUG headers:235 - << Connection: close
2010-12-28 22:27:02,362 DEBUG ClientParamsStack:215 -
'http.protocol.handle-redirects': false
2010-12-28 22:27:02,362 ERROR InstanceUploader:148 - Location header was
absent
2010-12-28 22:27:02,362 WARN FormVxmlRenderer:806 - Instance upload to
server at
http://ehs.hopto.org/openmrs_devel/moduleServlet/xforms/xformDataUpload.form?uname=pmunoz&pw=xxxxxxxx
failed. Will try again in 60000 ms.
--
Pavel Stephan Muñoz
--
Post: opendatakit@googlegroups.com
Unsubscribe: opendatakit+unsubscribe@googlegroups.comopendatakit%2Bunsubscribe@googlegroups.com
Options: http://groups.google.com/group/opendatakit?hl=en
--
Post: opendatakit@googlegroups.com
Unsubscribe: opendatakit+unsubscribe@googlegroups.comopendatakit%2Bunsubscribe@googlegroups.com
Options: http://groups.google.com/group/opendatakit?hl=en
--
Gerente de Desarrollo, eHealth Systems
Research Fellow, Escuela de Medicina de Harvard
Moderador, GHDOnline.org
--
Pavel Stephan Muñoz