Compare commits

...

4 Commits

Author SHA1 Message Date
mbartlett21
9aa01250a7
Merge b0470f4a0eab396ef116c77dcae0cb75ebe17fce into 98be8d9fc1de19ec526cf7bee0d03a1e78262ba8 2024-02-19 03:05:00 -07:00
Alexandre Detiste
98be8d9fc1
chore(http): Correct typos in error message and code comments (#423) 2024-02-12 11:28:01 +03:00
mbartlett21
b0470f4a0e
Receive line with ending 2020-01-17 12:17:32 +10:00
mbartlett21
c27c23074c
TCP Receive without *
The TCP Receive code now uses a switch statement and allows dropping the * at the start of the string, like Lua's io library
2020-01-17 12:08:54 +10:00
4 changed files with 25 additions and 12 deletions

View File

@ -9,7 +9,7 @@
* Internal function prototypes * Internal function prototypes
\*=========================================================================*/ \*=========================================================================*/
static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b); static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b);
static int recvline(p_buffer buf, luaL_Buffer *b); static int recvline(p_buffer buf, luaL_Buffer *b, int chop);
static int recvall(p_buffer buf, luaL_Buffer *b); static int recvall(p_buffer buf, luaL_Buffer *b);
static int buffer_get(p_buffer buf, const char **data, size_t *count); static int buffer_get(p_buffer buf, const char **data, size_t *count);
static void buffer_skip(p_buffer buf, size_t count); static void buffer_skip(p_buffer buf, size_t count);
@ -117,10 +117,21 @@ int buffer_meth_receive(lua_State *L, p_buffer buf) {
luaL_addlstring(&b, part, size); luaL_addlstring(&b, part, size);
/* receive new patterns */ /* receive new patterns */
if (!lua_isnumber(L, 2)) { if (!lua_isnumber(L, 2)) {
const char *p= luaL_optstring(L, 2, "*l"); const char *p = luaL_optstring(L, 2, "l");
if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b); if (*p == '*') p++; /* skip optional '*' (for compatibility) */
else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b); switch (*p) {
else luaL_argcheck(L, 0, 2, "invalid receive pattern"); case 'l': /* line */
err = recvline(buf, &b, 1);
break;
case 'L': /* line with \n */
err = recvline(buf, &b, 0);
break;
case 'a': /* all */
err = recvall(buf, &b);
break;
default:
luaL_argcheck(L, 0, 2, "invalid receive pattern");
}
/* get a fixed number of bytes (minus what was already partially /* get a fixed number of bytes (minus what was already partially
* received) */ * received) */
} else { } else {
@ -222,7 +233,7 @@ static int recvall(p_buffer buf, luaL_Buffer *b) {
* Reads a line terminated by a CR LF pair or just by a LF. The CR and LF * Reads a line terminated by a CR LF pair or just by a LF. The CR and LF
* are not returned by the function and are discarded from the buffer * are not returned by the function and are discarded from the buffer
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
static int recvline(p_buffer buf, luaL_Buffer *b) { static int recvline(p_buffer buf, luaL_Buffer *b, int chop) {
int err = IO_DONE; int err = IO_DONE;
while (err == IO_DONE) { while (err == IO_DONE) {
size_t count, pos; const char *data; size_t count, pos; const char *data;
@ -234,6 +245,8 @@ static int recvline(p_buffer buf, luaL_Buffer *b) {
pos++; pos++;
} }
if (pos < count) { /* found '\n' */ if (pos < count) { /* found '\n' */
if (!chop)
luaL_addchar(b, '\n');
buffer_skip(buf, pos+1); /* skip '\n' too */ buffer_skip(buf, pos+1); /* skip '\n' too */
break; /* we are done */ break; /* we are done */
} else /* reached the end of the buffer */ } else /* reached the end of the buffer */

View File

@ -54,7 +54,7 @@ local function receiveheaders(sock, headers)
while line ~= "" do while line ~= "" do
-- get field-name and value -- get field-name and value
name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)")) name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)"))
if not (name and value) then return nil, "malformed reponse headers" end if not (name and value) then return nil, "malformed response headers" end
name = string.lower(name) name = string.lower(name)
-- get next line (value might be folded) -- get next line (value might be folded)
line, err = sock:receive() line, err = sock:receive()
@ -81,7 +81,7 @@ socket.sourcet["http-chunked"] = function(sock, headers)
dirty = function() return sock:dirty() end dirty = function() return sock:dirty() end
}, { }, {
__call = function() __call = function()
-- get chunk size, skip extention -- get chunk size, skip extension
local line, err = sock:receive() local line, err = sock:receive()
if err then return nil, err end if err then return nil, err end
local size = base.tonumber(string.gsub(line, ";.*", ""), 16) local size = base.tonumber(string.gsub(line, ";.*", ""), 16)
@ -281,7 +281,7 @@ local function adjustrequest(reqt)
if not (host and host ~= "") then if not (host and host ~= "") then
socket.try(nil, "invalid host '" .. base.tostring(nreqt.host) .. "'") socket.try(nil, "invalid host '" .. base.tostring(nreqt.host) .. "'")
end end
-- compute uri if user hasn't overriden -- compute uri if user hasn't overridden
nreqt.uri = reqt.uri or adjusturi(nreqt) nreqt.uri = reqt.uri or adjusturi(nreqt)
-- adjust headers in request -- adjust headers in request
nreqt.headers = adjustheaders(nreqt) nreqt.headers = adjustheaders(nreqt)

View File

@ -1,6 +1,6 @@
# luasocket src/makefile # luasocket src/makefile
# #
# Definitions in this section can be overriden on the command line or in the # Definitions in this section can be overridden on the command line or in the
# environment. # environment.
# #
# These are equivalent: # These are equivalent:

View File

@ -225,7 +225,7 @@ local function adjust_headers(mesgt)
lower["date"] = lower["date"] or lower["date"] = lower["date"] or
os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or _M.ZONE) os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or _M.ZONE)
lower["x-mailer"] = lower["x-mailer"] or socket._VERSION lower["x-mailer"] = lower["x-mailer"] or socket._VERSION
-- this can't be overriden -- this can't be overridden
lower["mime-version"] = "1.0" lower["mime-version"] = "1.0"
return lower return lower
end end
@ -253,4 +253,4 @@ _M.send = socket.protect(function(mailt)
return s:close() return s:close()
end) end)
return _M return _M