diff options
author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2007-10-13 23:55:20 +0000 |
---|---|---|
committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2007-10-13 23:55:20 +0000 |
commit | d1a72435d5bd3528f3c334cd4d1da16dcead47bf (patch) | |
tree | ca6f092afee764923d747b0f0b6fd1ad2418cfae /src | |
parent | 52ac60af8132ae7e42151d3012a9607d7cadaf95 (diff) | |
download | luasocket-d1a72435d5bd3528f3c334cd4d1da16dcead47bf.tar.gz luasocket-d1a72435d5bd3528f3c334cd4d1da16dcead47bf.tar.bz2 luasocket-d1a72435d5bd3528f3c334cd4d1da16dcead47bf.zip |
New release.
Diffstat (limited to 'src')
-rw-r--r-- | src/http.lua | 28 | ||||
-rw-r--r-- | src/usocket.c | 2 |
2 files changed, 24 insertions, 6 deletions
diff --git a/src/http.lua b/src/http.lua index 9d739a4..3a386a6 100644 --- a/src/http.lua +++ b/src/http.lua | |||
@@ -142,7 +142,12 @@ function metat.__index:sendbody(headers, source, step) | |||
142 | end | 142 | end |
143 | 143 | ||
144 | function metat.__index:receivestatusline() | 144 | function metat.__index:receivestatusline() |
145 | local status = self.try(self.c:receive()) | 145 | local status = self.try(self.c:receive(5)) |
146 | -- identify HTTP/0.9 responses, which do not contain a status line | ||
147 | -- this is just a heuristic, but is what the RFC recommends | ||
148 | if status ~= "HTTP/" then return nil, status end | ||
149 | -- otherwise proceed reading a status line | ||
150 | status = self.try(self.c:receive("*l", status)) | ||
146 | local code = socket.skip(2, string.find(status, "HTTP/%d*%.%d* (%d%d%d)")) | 151 | local code = socket.skip(2, string.find(status, "HTTP/%d*%.%d* (%d%d%d)")) |
147 | return self.try(base.tonumber(code), status) | 152 | return self.try(base.tonumber(code), status) |
148 | end | 153 | end |
@@ -163,6 +168,12 @@ function metat.__index:receivebody(headers, sink, step) | |||
163 | sink, step)) | 168 | sink, step)) |
164 | end | 169 | end |
165 | 170 | ||
171 | function metat.__index:receive09body(status, sink, step) | ||
172 | local source = ltn12.source.rewind(socket.source("until-closed", self.c)) | ||
173 | source(status) | ||
174 | return self.try(ltn12.pump.all(source, sink, step)) | ||
175 | end | ||
176 | |||
166 | function metat.__index:close() | 177 | function metat.__index:close() |
167 | return self.c:close() | 178 | return self.c:close() |
168 | end | 179 | end |
@@ -271,6 +282,7 @@ function tredirect(reqt, location) | |||
271 | create = reqt.create | 282 | create = reqt.create |
272 | } | 283 | } |
273 | -- pass location header back as a hint we redirected | 284 | -- pass location header back as a hint we redirected |
285 | headers = headers or {} | ||
274 | headers.location = headers.location or location | 286 | headers.location = headers.location or location |
275 | return result, code, headers, status | 287 | return result, code, headers, status |
276 | end | 288 | end |
@@ -283,17 +295,23 @@ function trequest(reqt) | |||
283 | -- send request line and headers | 295 | -- send request line and headers |
284 | h:sendrequestline(nreqt.method, nreqt.uri) | 296 | h:sendrequestline(nreqt.method, nreqt.uri) |
285 | h:sendheaders(nreqt.headers) | 297 | h:sendheaders(nreqt.headers) |
286 | local code = 100 | 298 | -- if there is a body, send it |
287 | local headers, status | ||
288 | -- if there is a body, check for server status | ||
289 | if nreqt.source then | 299 | if nreqt.source then |
290 | h:sendbody(nreqt.headers, nreqt.source, nreqt.step) | 300 | h:sendbody(nreqt.headers, nreqt.source, nreqt.step) |
291 | end | 301 | end |
302 | local code, status = h:receivestatusline() | ||
303 | -- if it is an HTTP/0.9 server, simply get the body and we are done | ||
304 | if not code then | ||
305 | h:receive09body(status, nreqt.sink, nreqt.step) | ||
306 | return 1, 200 | ||
307 | end | ||
308 | local headers | ||
292 | -- ignore any 100-continue messages | 309 | -- ignore any 100-continue messages |
293 | while code == 100 do | 310 | while code == 100 do |
294 | code, status = h:receivestatusline() | ||
295 | headers = h:receiveheaders() | 311 | headers = h:receiveheaders() |
312 | code, status = h:receivestatusline() | ||
296 | end | 313 | end |
314 | headers = h:receiveheaders() | ||
297 | -- at this point we should have a honest reply from the server | 315 | -- at this point we should have a honest reply from the server |
298 | -- we can't redirect if we already used the source, so we report the error | 316 | -- we can't redirect if we already used the source, so we report the error |
299 | if shouldredirect(nreqt, code, headers) and not nreqt.source then | 317 | if shouldredirect(nreqt, code, headers) and not nreqt.source then |
diff --git a/src/usocket.c b/src/usocket.c index ef275b4..2c30b9a 100644 --- a/src/usocket.c +++ b/src/usocket.c | |||
@@ -359,7 +359,7 @@ const char *socket_strerror(int err) { | |||
359 | case ECONNREFUSED: return "connection refused"; | 359 | case ECONNREFUSED: return "connection refused"; |
360 | case ECONNABORTED: return "closed"; | 360 | case ECONNABORTED: return "closed"; |
361 | case ECONNRESET: return "closed"; | 361 | case ECONNRESET: return "closed"; |
362 | case ETIMEDOUT: return "timedout"; | 362 | case ETIMEDOUT: return "timeout"; |
363 | default: return strerror(errno); | 363 | default: return strerror(errno); |
364 | } | 364 | } |
365 | } | 365 | } |