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 | |
| parent | b22f6f3830515a57a8776e7489b3e2d434abd12f (diff) | |
| download | luasocket-8b114f3bf4ccea3b065551fa94649a9e45935b5b.tar.gz luasocket-8b114f3bf4ccea3b065551fa94649a9e45935b5b.tar.bz2 luasocket-8b114f3bf4ccea3b065551fa94649a9e45935b5b.zip | |
Stupid bug in http.lua.
Diffstat (limited to 'src')
| -rw-r--r-- | src/http.lua | 53 | ||||
| -rw-r--r-- | src/mime.lua | 32 | ||||
| -rw-r--r-- | src/select.c | 4 | ||||
| -rw-r--r-- | src/smtp.lua | 2 | ||||
| -rw-r--r-- | src/socket.lua | 41 | ||||
| -rw-r--r-- | src/url.lua | 2 |
6 files changed, 69 insertions, 65 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() |
diff --git a/src/mime.lua b/src/mime.lua index 6492a96..6ef82b8 100644 --- a/src/mime.lua +++ b/src/mime.lua | |||
| @@ -15,9 +15,9 @@ local mime = require("cmime") | |||
| 15 | module("mime") | 15 | module("mime") |
| 16 | 16 | ||
| 17 | -- encode, decode and wrap algorithm tables | 17 | -- encode, decode and wrap algorithm tables |
| 18 | mime.encodet = {} | 18 | encodet = {} |
| 19 | mime.decodet = {} | 19 | decodet = {} |
| 20 | mime.wrapt = {} | 20 | wrapt = {} |
| 21 | 21 | ||
| 22 | -- creates a function that chooses a filter by name from a given table | 22 | -- creates a function that chooses a filter by name from a given table |
| 23 | local function choose(table) | 23 | local function choose(table) |
| @@ -32,21 +32,21 @@ local function choose(table) | |||
| 32 | end | 32 | end |
| 33 | 33 | ||
| 34 | -- define the encoding filters | 34 | -- define the encoding filters |
| 35 | mime.encodet['base64'] = function() | 35 | encodet['base64'] = function() |
| 36 | return ltn12.filter.cycle(b64, "") | 36 | return ltn12.filter.cycle(b64, "") |
| 37 | end | 37 | end |
| 38 | 38 | ||
| 39 | mime.encodet['quoted-printable'] = function(mode) | 39 | encodet['quoted-printable'] = function(mode) |
| 40 | return ltn12.filter.cycle(qp, "", | 40 | return ltn12.filter.cycle(qp, "", |
| 41 | (mode == "binary") and "=0D=0A" or "\r\n") | 41 | (mode == "binary") and "=0D=0A" or "\r\n") |
| 42 | end | 42 | end |
| 43 | 43 | ||
| 44 | -- define the decoding filters | 44 | -- define the decoding filters |
| 45 | mime.decodet['base64'] = function() | 45 | decodet['base64'] = function() |
| 46 | return ltn12.filter.cycle(unb64, "") | 46 | return ltn12.filter.cycle(unb64, "") |
| 47 | end | 47 | end |
| 48 | 48 | ||
| 49 | mime.decodet['quoted-printable'] = function() | 49 | decodet['quoted-printable'] = function() |
| 50 | return ltn12.filter.cycle(unqp, "") | 50 | return ltn12.filter.cycle(unqp, "") |
| 51 | end | 51 | end |
| 52 | 52 | ||
| @@ -60,29 +60,29 @@ local function format(chunk) | |||
| 60 | end | 60 | end |
| 61 | 61 | ||
| 62 | -- define the line-wrap filters | 62 | -- define the line-wrap filters |
| 63 | mime.wrapt['text'] = function(length) | 63 | wrapt['text'] = function(length) |
| 64 | length = length or 76 | 64 | length = length or 76 |
| 65 | return ltn12.filter.cycle(wrp, length, length) | 65 | return ltn12.filter.cycle(wrp, length, length) |
| 66 | end | 66 | end |
| 67 | mime.wrapt['base64'] = wrapt['text'] | 67 | wrapt['base64'] = wrapt['text'] |
| 68 | mime.wrapt['default'] = wrapt['text'] | 68 | wrapt['default'] = wrapt['text'] |
| 69 | 69 | ||
| 70 | mime.wrapt['quoted-printable'] = function() | 70 | wrapt['quoted-printable'] = function() |
| 71 | return ltn12.filter.cycle(qpwrp, 76, 76) | 71 | return ltn12.filter.cycle(qpwrp, 76, 76) |
| 72 | end | 72 | end |
| 73 | 73 | ||
| 74 | -- function that choose the encoding, decoding or wrap algorithm | 74 | -- function that choose the encoding, decoding or wrap algorithm |
| 75 | mime.encode = choose(encodet) | 75 | encode = choose(encodet) |
| 76 | mime.decode = choose(decodet) | 76 | decode = choose(decodet) |
| 77 | mime.wrap = choose(wrapt) | 77 | wrap = choose(wrapt) |
| 78 | 78 | ||
| 79 | -- define the end-of-line normalization filter | 79 | -- define the end-of-line normalization filter |
| 80 | function mime.normalize(marker) | 80 | function normalize(marker) |
| 81 | return ltn12.filter.cycle(eol, 0, marker) | 81 | return ltn12.filter.cycle(eol, 0, marker) |
| 82 | end | 82 | end |
| 83 | 83 | ||
| 84 | -- high level stuffing filter | 84 | -- high level stuffing filter |
| 85 | function mime.stuff() | 85 | function stuff() |
| 86 | return ltn12.filter.cycle(dot, 2) | 86 | return ltn12.filter.cycle(dot, 2) |
| 87 | end | 87 | end |
| 88 | 88 | ||
diff --git a/src/select.c b/src/select.c index efdbdff..e2cd91d 100644 --- a/src/select.c +++ b/src/select.c | |||
| @@ -124,7 +124,7 @@ static int collect_fd(lua_State *L, int tab, int max_fd, | |||
| 124 | break; | 124 | break; |
| 125 | } | 125 | } |
| 126 | fd = getfd(L); | 126 | fd = getfd(L); |
| 127 | if (fd > 0) { | 127 | if (fd >= 0) { |
| 128 | FD_SET(fd, set); | 128 | FD_SET(fd, set); |
| 129 | if (max_fd < fd) max_fd = fd; | 129 | if (max_fd < fd) max_fd = fd; |
| 130 | lua_pushnumber(L, fd); | 130 | lua_pushnumber(L, fd); |
| @@ -150,7 +150,7 @@ static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) { | |||
| 150 | break; | 150 | break; |
| 151 | } | 151 | } |
| 152 | fd = getfd(L); | 152 | fd = getfd(L); |
| 153 | if (fd > 0 && dirty(L)) { | 153 | if (fd >= 0 && dirty(L)) { |
| 154 | lua_pushnumber(L, ++ndirty); | 154 | lua_pushnumber(L, ++ndirty); |
| 155 | lua_pushvalue(L, -2); | 155 | lua_pushvalue(L, -2); |
| 156 | lua_settable(L, dtab); | 156 | lua_settable(L, dtab); |
diff --git a/src/smtp.lua b/src/smtp.lua index 12c2195..944a40f 100644 --- a/src/smtp.lua +++ b/src/smtp.lua | |||
| @@ -211,7 +211,7 @@ end | |||
| 211 | -- set defaul headers | 211 | -- set defaul headers |
| 212 | local function adjust_headers(mesgt) | 212 | local function adjust_headers(mesgt) |
| 213 | local lower = {} | 213 | local lower = {} |
| 214 | for i,v in (mesgt.headers or lower) do | 214 | for i,v in base.pairs(mesgt.headers or lower) do |
| 215 | lower[string.lower(i)] = v | 215 | lower[string.lower(i)] = v |
| 216 | end | 216 | end |
| 217 | lower["date"] = lower["date"] or | 217 | lower["date"] = lower["date"] or |
diff --git a/src/socket.lua b/src/socket.lua index f3563e7..9a523fe 100644 --- a/src/socket.lua +++ b/src/socket.lua | |||
| @@ -62,19 +62,6 @@ socket.sinkt = {} | |||
| 62 | 62 | ||
| 63 | socket.BLOCKSIZE = 2048 | 63 | socket.BLOCKSIZE = 2048 |
| 64 | 64 | ||
| 65 | socket.sinkt["http-chunked"] = function(sock) | ||
| 66 | return base.setmetatable({ | ||
| 67 | getfd = function() return sock:getfd() end, | ||
| 68 | dirty = function() return sock:dirty() end | ||
| 69 | }, { | ||
| 70 | __call = function(self, chunk, err) | ||
| 71 | if not chunk then return sock:send("0\r\n\r\n") end | ||
| 72 | local size = string.format("%X\r\n", string.len(chunk)) | ||
| 73 | return sock:send(size .. chunk .. "\r\n") | ||
| 74 | end | ||
| 75 | }) | ||
| 76 | end | ||
| 77 | |||
| 78 | socket.sinkt["close-when-done"] = function(sock) | 65 | socket.sinkt["close-when-done"] = function(sock) |
| 79 | return base.setmetatable({ | 66 | return base.setmetatable({ |
| 80 | getfd = function() return sock:getfd() end, | 67 | getfd = function() return sock:getfd() end, |
| @@ -140,34 +127,6 @@ socket.sourcet["until-closed"] = function(sock) | |||
| 140 | }) | 127 | }) |
| 141 | end | 128 | end |
| 142 | 129 | ||
| 143 | socket.sourcet["http-chunked"] = function(sock) | ||
| 144 | return base.setmetatable({ | ||
| 145 | getfd = function() return sock:getfd() end, | ||
| 146 | dirty = function() return sock:dirty() end | ||
| 147 | }, { | ||
| 148 | __call = function() | ||
| 149 | -- get chunk size, skip extention | ||
| 150 | local line, err = sock:receive() | ||
| 151 | if err then return nil, err end | ||
| 152 | local size = base.tonumber(string.gsub(line, ";.*", ""), 16) | ||
| 153 | if not size then return nil, "invalid chunk size" end | ||
| 154 | -- was it the last chunk? | ||
| 155 | if size <= 0 then | ||
| 156 | -- skip trailer headers, if any | ||
| 157 | local line, err = sock:receive() | ||
| 158 | while not err and line ~= "" do | ||
| 159 | line, err = sock:receive() | ||
| 160 | end | ||
| 161 | return nil, err | ||
| 162 | else | ||
| 163 | -- get chunk and skip terminating CRLF | ||
| 164 | local chunk, err = sock:receive(size) | ||
| 165 | if chunk then sock:receive() end | ||
| 166 | return chunk, err | ||
| 167 | end | ||
| 168 | end | ||
| 169 | }) | ||
| 170 | end | ||
| 171 | 130 | ||
| 172 | socket.sourcet["default"] = socket.sourcet["until-closed"] | 131 | socket.sourcet["default"] = socket.sourcet["until-closed"] |
| 173 | 132 | ||
diff --git a/src/url.lua b/src/url.lua index 7aa3760..f29ecc8 100644 --- a/src/url.lua +++ b/src/url.lua | |||
| @@ -119,7 +119,7 @@ end | |||
| 119 | function parse(url, default) | 119 | function parse(url, default) |
| 120 | -- initialize default parameters | 120 | -- initialize default parameters |
| 121 | local parsed = {} | 121 | local parsed = {} |
| 122 | for i,v in (default or parsed) do parsed[i] = v end | 122 | for i,v in base.pairs(default or parsed) do parsed[i] = v end |
| 123 | -- empty url is parsed to nil | 123 | -- empty url is parsed to nil |
| 124 | if not url or url == "" then return nil, "invalid url" end | 124 | if not url or url == "" then return nil, "invalid url" end |
| 125 | -- remove whitespace | 125 | -- remove whitespace |
