0

Issue

I have an ajax form that will post multiple files to a server. The submission works with one or two files, but adding more will trigger a timeout error, and I can't figure out where it's coming from.

I've looked at everything I can think of to see if there's a default setting in one of my plugins to no avail.

I'm not sure what information will be helpful in resolving this, so I'll tell as much as I know. Let me know if you need to see anything I'm not showing.

Details

I'm using this approach to serialize the file data: Sending multipart/formdata with jQuery.ajax

I have two servers. An Express server at :3000 to handle presentational data, and a Hapi server at port :3001 to handle database transactions and backend logic. In between those, I'm using http-proxy to send requests from localhost:3000/api to localhost:3001/api.

Then... I have this hosted on an Apache centOS server. From there, www.url.com is mapped to localhost:3000.

    -----------
    | browser |
    -----------
         |
 [jQuery AJAX POST]
         |
         v
-------------------                           ------------------------------------
| www.url.com/api |  --[Apache ProxyPass]-->  | localhost:3000/api (express app) |
-------------------                           ------------------------------------
                                                                |
                                                     [node/express http-proxy]
                                                                |
                                                                v
                                                ---------------------------------
                                                | localhost:3001/api (hapi api) |
                                                ---------------------------------

According to the logs, it never makes it to the api. I can log a successful connection on the express server, but then I get a timeout error after about 11-12 seconds.

I'm led to believe it's an issue somewhere with express or http-proxy, but I can't figure out where.

Failed Attempts

  • I've tried setting jQuery ajax timeout to 10 minutes, and alternatively having no timeout at all.
  • I've tried setting apache timeout to 60 minutes via httpd.conf file.
  • I've tried setting a timeout on the http-proxy middleware, then started seeing 502 gateway errors.

Error

POST 
http://#############/api/new-request 408 (Request Timeout)
    Q.cors.e.crossDomain.send @ vendor.min.js:26
    Z.extend.ajax             @ vendor.min.js:25
    e @ evaluate-risk:2s      @ vendor.min.js:55
    (anonymous function)      @ vendor.min.js:55
    Z.event.dispatch          @ vendor.min.js:25
    m.handle                  @ vendor.min.js:24

    evaluate-risk:2 Object {readyState: 4, responseText: "{"statusCode":408,"error":"Request Timeout"}", responseJSON: Object, status: 408, statusText: "Request Timeout"}abort: (e)always: ()complete: ()done: ()error: ()fail: ()getAllResponseHeaders: ()getResponseHeader: (e)overrideMimeType: (e)pipe: ()progress: ()promise: (e)readyState: 4responseJSON: ObjectresponseText: "{"statusCode":408,"error":"Request Timeout"}"setRequestHeader: (e,t)state: ()status: 408statusCode: (e)statusText: "Request Timeout"success: ()then: ()__proto__: ObjectjQuery.ajax.error @ evaluate-risk:2c @ vendor.min.js:24f.fireWith @ vendor.min.js:24n @ vendor.min.js:25(anonymous function) @ vendor.min.js:26
Community
  • 1
  • 1
Christian Hain
  • 619
  • 4
  • 11

1 Answers1

0

Hapi was causing the timeout.

I needed to set the payload timeout.

{
    method: 'POST',
    path: '/api/new-request',
    config: {
        payload: {
            output: 'stream',
            parse: true,
            allow: 'multipart/form-data',
            maxBytes: 20000000,
            timeout: 60000
        },
    },
    handler: api.requests.new
}
Christian Hain
  • 619
  • 4
  • 11