diff options
| author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2005-06-12 22:02:21 +0000 |
|---|---|---|
| committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2005-06-12 22:02:21 +0000 |
| commit | 8b114f3bf4ccea3b065551fa94649a9e45935b5b (patch) | |
| tree | 06f2faa7e896e9434ba89ec68445ea56e6c8c6dc /src/http.lua | |
| parent | b22f6f3830515a57a8776e7489b3e2d434abd12f (diff) | |
| download | luasocket-8b114f3bf4ccea3b065551fa94649a9e45935b5b.tar.gz luasocket-8b114f3bf4ccea3b065551fa94649a9e45935b5b.tar.bz2 luasocket-8b114f3bf4ccea3b065551fa94649a9e45935b5b.zip | |
Stupid bug in http.lua.
Diffstat (limited to 'src/http.lua')
| -rw-r--r-- | src/http.lua | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/src/http.lua b/src/http.lua index 38b93e2..669f54d 100644 --- a/src/http.lua +++ b/src/http.lua | |||
| @@ -28,6 +28,51 @@ PORT = 80 | |||
| 28 | USERAGENT = socket.VERSION | 28 | USERAGENT = socket.VERSION |
| 29 | 29 | ||
| 30 | ----------------------------------------------------------------------------- | 30 | ----------------------------------------------------------------------------- |
| 31 | -- Extra sources and sinks | ||
| 32 | ----------------------------------------------------------------------------- | ||
| 33 | socket.sourcet["http-chunked"] = function(sock) | ||
| 34 | return base.setmetatable({ | ||
| 35 | getfd = function() return sock:getfd() end, | ||
| 36 | dirty = function() return sock:dirty() end | ||
| 37 | }, { | ||
| 38 | __call = function() | ||
| 39 | -- get chunk size, skip extention | ||
| 40 | local line, err = sock:receive() | ||
| 41 | if err then return nil, err end | ||
| 42 | local size = base.tonumber(string.gsub(line, ";.*", ""), 16) | ||
| 43 | if not size then return nil, "invalid chunk size" end | ||
| 44 | -- was it the last chunk? | ||
| 45 | if size <= 0 then | ||
| 46 | -- skip trailer headers, if any | ||
| 47 | local line, err = sock:receive() | ||
| 48 | while not err and line ~= "" do | ||
| 49 | line, err = sock:receive() | ||
| 50 | end | ||
| 51 | return nil, err | ||
| 52 | else | ||
| 53 | -- get chunk and skip terminating CRLF | ||
| 54 | local chunk, err, part = sock:receive(size) | ||
| 55 | if chunk then sock:receive() end | ||
| 56 | return chunk, err | ||
| 57 | end | ||
| 58 | end | ||
| 59 | }) | ||
| 60 | end | ||
| 61 | |||
| 62 | socket.sinkt["http-chunked"] = function(sock) | ||
| 63 | return base.setmetatable({ | ||
| 64 | getfd = function() return sock:getfd() end, | ||
| 65 | dirty = function() return sock:dirty() end | ||
| 66 | }, { | ||
| 67 | __call = function(self, chunk, err) | ||
| 68 | if not chunk then return sock:send("0\r\n\r\n") end | ||
| 69 | local size = string.format("%X\r\n", string.len(chunk)) | ||
| 70 | return sock:send(size .. chunk .. "\r\n") | ||
| 71 | end | ||
| 72 | }) | ||
| 73 | end | ||
| 74 | |||
| 75 | ----------------------------------------------------------------------------- | ||
| 31 | -- Low level HTTP API | 76 | -- Low level HTTP API |
| 32 | ----------------------------------------------------------------------------- | 77 | ----------------------------------------------------------------------------- |
| 33 | local metat = { __index = {} } | 78 | local metat = { __index = {} } |
| @@ -70,7 +115,7 @@ function metat.__index:sendheaders(headers) | |||
| 70 | end | 115 | end |
| 71 | 116 | ||
| 72 | function metat.__index:sendbody(headers, source, step) | 117 | function metat.__index:sendbody(headers, source, step) |
| 73 | source = source or ltn12.source.empty() | 118 | source = source or ltn12.source.empty() |
| 74 | step = step or ltn12.pump.step | 119 | step = step or ltn12.pump.step |
| 75 | -- if we don't know the size in advance, send chunked and hope for the best | 120 | -- if we don't know the size in advance, send chunked and hope for the best |
| 76 | local mode = "http-chunked" | 121 | local mode = "http-chunked" |
| @@ -155,7 +200,7 @@ end | |||
| 155 | local function adjustheaders(headers, host) | 200 | local function adjustheaders(headers, host) |
| 156 | local lower = {} | 201 | local lower = {} |
| 157 | -- override with user values | 202 | -- override with user values |
| 158 | for i,v in (headers or lower) do | 203 | for i,v in pairs(headers or lower) do |
| 159 | lower[string.lower(i)] = v | 204 | lower[string.lower(i)] = v |
| 160 | end | 205 | end |
| 161 | lower["user-agent"] = lower["user-agent"] or USERAGENT | 206 | lower["user-agent"] = lower["user-agent"] or USERAGENT |
| @@ -175,7 +220,7 @@ local function adjustrequest(reqt) | |||
| 175 | local nreqt = reqt.url and url.parse(reqt.url, default) or {} | 220 | local nreqt = reqt.url and url.parse(reqt.url, default) or {} |
| 176 | local t = url.parse(reqt.url, default) | 221 | local t = url.parse(reqt.url, default) |
| 177 | -- explicit components override url | 222 | -- explicit components override url |
| 178 | for i,v in reqt do nreqt[i] = reqt[i] end | 223 | for i,v in pairs(reqt) do nreqt[i] = v end |
| 179 | socket.try(nreqt.host, "invalid host '" .. base.tostring(nreqt.host) .. "'") | 224 | socket.try(nreqt.host, "invalid host '" .. base.tostring(nreqt.host) .. "'") |
| 180 | -- compute uri if user hasn't overriden | 225 | -- compute uri if user hasn't overriden |
| 181 | nreqt.uri = reqt.uri or adjusturi(nreqt) | 226 | nreqt.uri = reqt.uri or adjusturi(nreqt) |
| @@ -238,7 +283,7 @@ function trequest(reqt) | |||
| 238 | local h = open(reqt.host, reqt.port, reqt.connect) | 283 | local h = open(reqt.host, reqt.port, reqt.connect) |
| 239 | h:sendrequestline(reqt.method, reqt.uri) | 284 | h:sendrequestline(reqt.method, reqt.uri) |
| 240 | h:sendheaders(reqt.headers) | 285 | h:sendheaders(reqt.headers) |
| 241 | h:sendbody(reqt.headers, reqt.source, reqt.step) | 286 | if reqt.source then h:sendbody(reqt.headers, reqt.source, reqt.step) end |
| 242 | local code, headers, status | 287 | local code, headers, status |
| 243 | code, status = h:receivestatusline() | 288 | code, status = h:receivestatusline() |
| 244 | headers = h:receiveheaders() | 289 | headers = h:receiveheaders() |
