1

I have a program to send POST request to a server.
I'm using cURL to send request.
My program run on Windows and Linux (on the moment Ubuntu 9.10).

When server receive request it processing it and return error code (0000 if no errors) and error description (if any).
Server's web server is Microsoft IIS.

When I run my program at Windows it work well.
But when I run the program at Linux it hangs up for 30 seconds (cURL's timeout) and return error "Operation timed out after 30000 milliseconds with 5 bytes received".
As I know problem in server side - server doesn't send response's size and doesn't close socket connection.

cURL logs (from Linux):


11:00:09.544    Process()       curl: libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.15
11:00:09.941    DebugCallback() About to connect() to sms1.redoxygen.net port 80 (#0)
11:00:09.941    DebugCallback() Trying 203.145.62.146...
11:00:10.084    DebugCallback() Connected to sms1.redoxygen.net (203.145.62.146) port 80 (#0)
11:00:10.085    DebugCallback() POST /sms.dll?private&type=26 HTTP/1.1
                                Host: sms1.redoxygen.net
                                Content-Length: 244
11:00:10.086    DebugCallback() [244 bytes of DATA]
11:00:10.087    ReadCallback()  No more data to send
11:00:10.292    WriteCallback() HTTP/1.1 200 OK
11:00:10.293    DebugCallback() Content-Type: text/html
11:00:10.294    DebugCallback() no chunk, no close, no size. Assume close to signal end
11:00:10.294    WriteCallback() 
11:00:10.466    DebugCallback() 0000 
11:00:40.500    DebugCallback() Operation timed out after 30000 milliseconds with 5 bytes received
11:00:40.501    DebugCallback() Closing connection #0

On Windows logs are almost the same, but without timeout - it close socket immediately after reciving "0000 ".

I can analyse received data and close connection if I get "0000 ", but it's a "dirty hack".

Any ideas?

Dmitriy
  • 3,305
  • 7
  • 44
  • 55
  • You didn't mention why you have to support an illegal HTTP response like this one? Why not just fix the server to return a valid response? – EricLaw Feb 22 '10 at 02:23
  • @EricLaw -MSFT: Good point, but I can't change server's implementation. I can't understand WHY it work well at Windows. May be ISS send some additional information? – Dmitriy Feb 22 '10 at 04:29
  • Does the same thing happen when you execute the request via telnet/netcat? – jdizzle Feb 22 '10 at 23:02
  • @jdizzle: I'm not sure about telnet, but the same thing happen when I using command line version of curl. Moreover, the same thing happen if I use Firefox - on Windows it work fine, but if I'm open "http://sms1.redoxygen.net/sms.dll?private&type=26" in Firefox on Ubuntu it show me "Tranfering data from sms1.redoxygen.net..." in status bar. – Dmitriy Feb 23 '10 at 04:57
  • 1
    If the web server responds in a broken way to other various working clients, then it should a) be fixed or b) not claim to be http. In order to further debug this I'd recommend using wireshark to capture the requests made by MSIE (or whatever actually works) and see what they look like. Also, can you specify "connection: close" using libcurl? Maybe that will help. – jdizzle Feb 23 '10 at 16:43

2 Answers2

0

Your question doesn't reveal how you use libcurl, thus this isn't easy to answer accurately without a lot of guessing. I would also assume some of those missing details would reveal why the app works differently on Linux and Windows.

Your request sends a content-length of 244 but the output you show doesn't include any request-body, why? To me it looks like the server is legitimately waiting for that data to arrive but you don't provide it.

So, you send a weird request. The server replies with a weird response. Garbage in, garbage out I guess.

Daniel Stenberg
  • 54,736
  • 17
  • 146
  • 222
  • Thank you for your answer. I removed the request's body because it contain private information. I'm sending exact number of bytes (in this case 244). Server accept the request and send "0000 " back. Moreover the server process request correctly (in this case send SMS to my mobile). But connection hangs up. – Dmitriy Feb 22 '10 at 22:59
0

I found the reason of the issue.
The reason is - VirtualBox.
I'm using VirtualBox to run Ubuntu. If I'm run my program from real (not virtual) PC it work fine (even on Ubuntu). Looks like there is a bug in latest version of VirtualBox.

Dmitriy
  • 3,305
  • 7
  • 44
  • 55