From 3a8ba90dfb0c2eb224f317dd692ede426691e72a Mon Sep 17 00:00:00 2001
From: Diego Nehab
@@ -70,8 +70,8 @@ local ftp = require("socket.ftp")
URLs MUST conform to -RFC -1738, that is, an URL is a string in the form: +RFC 1738, +that is, an URL is a string in the form:
diff --git a/doc/http.html b/doc/http.html index a274aef..66282a4 100644 --- a/doc/http.html +++ b/doc/http.html @@ -45,8 +45,7 @@ namespace offers full support for the client side of the HTTP protocol (i.e., the facilities that would be used by a web-browser implementation). The implementation conforms to the HTTP/1.1 standard, -RFC -2616. +RFC 2616.@@ -67,8 +66,7 @@ local http = require("socket.http")
URLs must conform to -RFC -1738, +RFC 1738, that is, an URL is a string in the form:
@@ -199,8 +197,7 @@ it usually returns a message body (a web page informing the URL was not found or some other useless page). To make sure the operation was successful, check the returned status code. For a list of the possible values and their meanings, refer to RFC -2616. +href="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616.@@ -278,7 +275,7 @@ download and return status "401 Authentication Required". The HTTP/1.1 standard defines two authentication methods: the Basic Authentication Scheme and the Digest Authentication Scheme, both explained in detail in -RFC 2068. +RFC 2068.
The Basic Authentication Scheme sends @@ -304,7 +301,7 @@ b, c, h = http.request("http://fulano:silva@www.example.com/private/index.html") -- the request directly. r, c = http.request { url = "http://www.example.com/private/index.html", - headers = { authentication = "Basic " .. (mime.b64("fulano:silva")) } + headers = { authorization = "Basic " .. (mime.b64("fulano:silva")) } } diff --git a/doc/index.html b/doc/index.html index 5b54c59..665b97b 100644 --- a/doc/index.html +++ b/doc/index.html @@ -138,18 +138,22 @@ all!
+
- Fixed: manual sample of HTTP authentication now uses correct + "authorization" header (Alexandre Ittner); +
- Fixed: receive() returns immediatelly if prefix can satisfy + bytes requested (M Joonas Pihlaja);
- Fixed: multicast didn't work on Windows, or anywhere - else for that matter (Herbert Leuwer, Adrian Sietsma) + else for that matter (Herbert Leuwer, Adrian Sietsma);
- Fixed: select() now reports an error when called with more - sockets than FD_SETSIZE (Lorenzo Leonini) -
- Fixed: manual links to home.html changed to index.html (Robert Hahn) + sockets than FD_SETSIZE (Lorenzo Leonini); +
- Fixed: manual links to home.html changed to index.html (Robert Hahn);
- Fixed: mime.unb64() would return an empty string on results that started - with a null character (Robert Raschke) -
- Fixed: HTTP now automatically redirects on 303 and 307 (Jonathan Gray) + with a null character (Robert Raschke); +
- Fixed: HTTP now automatically redirects on 303 and 307 (Jonathan Gray);
- Fixed: calling sleep() with negative numbers could block forever, wasting CPU. Now it returns immediately (MPB);
- Improved: FTP commands are now sent in upper case to - help buggy servers (Anders Eurenius) + help buggy servers (Anders Eurenius);
- Improved: known headers now sent in canonic capitalization to help buggy servers (Joseph Stewart);
- Improved: Clarified tcp:receive() in the manual (MPB); diff --git a/doc/mime.html b/doc/mime.html index 9844744..ae136fd 100644 --- a/doc/mime.html +++ b/doc/mime.html @@ -44,11 +44,11 @@ content transfer encodings, such as Base64 and Quoted-Printable. It also provides functions to break text into lines and change the end-of-line convention. MIME is described mainly in -RFC 2045, -2046, -2047, -2048, and -2049. +RFC 2045, +2046, +2047, +2048, and +2049.
diff --git a/doc/smtp.html b/doc/smtp.html index 980b821..2ef673a 100644 --- a/doc/smtp.html +++ b/doc/smtp.html @@ -48,14 +48,13 @@ control (if you bother to read the code).
The implementation conforms to the Simple Mail Transfer Protocol, -RFC 2821. +RFC 2821. Another RFC of interest is RFC 2822, +href="http://www.ietf.org/rfc/rfc2822.txt">RFC 2822, which governs the Internet Message Format. Multipart messages (those that contain attachments) are part of the MIME standard, but described mainly -in RFC -2046 +in RFC 2046
In the description below, good understanding of LTN012, Filters @@ -196,7 +195,7 @@ part of the message and will not be sent to anyone.
-RFC 2822 +RFC 2822 has two important and short sections, "3.6.3. Destination address fields" and "5. Security considerations", explaining the proper use of these headers. Here is a summary of what it says: @@ -236,9 +235,9 @@ exactly what you don't want to happen!
I hope this clarifies the issue. Otherwise, please refer to -RFC 2821 +RFC 2821 and -RFC 2822. +RFC 2822.
diff --git a/doc/url.html b/doc/url.html index 303e05d..9f234d9 100644 --- a/doc/url.html +++ b/doc/url.html @@ -42,8 +42,7 @@ The url namespace provides functions to parse, protect, and build URLs, as well as functions to compose absolute URLs from base and relative URLs, according to -RFC -2396. +RFC 2396.@@ -91,7 +90,7 @@ The function returns a string with the absolute URL.
Note: The rules that govern the composition are fairly complex, and are described in detail in -RFC 2396. +RFC 2396. The example bellow should give an idea of what the rules are.
diff --git a/etc/dict.lua b/etc/dict.lua index 5c85aae..6eb3210 100644 --- a/etc/dict.lua +++ b/etc/dict.lua @@ -44,48 +44,48 @@ function metat.__index:check(ok) end function metat.__index:getdef() - local line = socket.try(self.tp:receive()) - local def = {} - while line ~= "." do - table.insert(def, line) - line = socket.try(self.tp:receive()) - end - return table.concat(def, "\n") + local line = socket.try(self.tp:receive()) + local def = {} + while line ~= "." do + table.insert(def, line) + line = socket.try(self.tp:receive()) + end + return table.concat(def, "\n") end function metat.__index:define(database, word) database = database or "!" - socket.try(self.tp:command("DEFINE", database .. " " .. word)) + socket.try(self.tp:command("DEFINE", database .. " " .. word)) local code, count = self:check(150) - local defs = {} - for i = 1, count do - self:check(151) - table.insert(defs, self:getdef()) - end - self:check(250) + local defs = {} + for i = 1, count do + self:check(151) + table.insert(defs, self:getdef()) + end + self:check(250) return defs end function metat.__index:match(database, strat, word) database = database or "!" strat = strat or "." - socket.try(self.tp:command("MATCH", database .." ".. strat .." ".. word)) + socket.try(self.tp:command("MATCH", database .." ".. strat .." ".. word)) self:check(152) - local mat = {} - local line = socket.try(self.tp:receive()) + local mat = {} + local line = socket.try(self.tp:receive()) while line ~= '.' do database, word = socket.skip(2, string.find(line, "(%S+) (.*)")) if not mat[database] then mat[database] = {} end table.insert(mat[database], word) - line = socket.try(self.tp:receive()) - end - self:check(250) + line = socket.try(self.tp:receive()) + end + self:check(250) return mat end function metat.__index:quit() - self.tp:command("QUIT") - return self:check(221) + self.tp:command("QUIT") + return self:check(221) end function metat.__index:close() diff --git a/etc/get.lua b/etc/get.lua index 09f639d..0d631c2 100644 --- a/etc/get.lua +++ b/etc/get.lua @@ -12,53 +12,53 @@ local ltn12 = require("ltn12") -- formats a number of seconds into human readable form function nicetime(s) - local l = "s" - if s > 60 then - s = s / 60 - l = "m" - if s > 60 then - s = s / 60 - l = "h" - if s > 24 then - s = s / 24 - l = "d" -- hmmm - end - end - end - if l == "s" then return string.format("%5.0f%s", s, l) - else return string.format("%5.2f%s", s, l) end + local l = "s" + if s > 60 then + s = s / 60 + l = "m" + if s > 60 then + s = s / 60 + l = "h" + if s > 24 then + s = s / 24 + l = "d" -- hmmm + end + end + end + if l == "s" then return string.format("%5.0f%s", s, l) + else return string.format("%5.2f%s", s, l) end end -- formats a number of bytes into human readable form function nicesize(b) - local l = "B" - if b > 1024 then - b = b / 1024 - l = "KB" - if b > 1024 then - b = b / 1024 - l = "MB" - if b > 1024 then - b = b / 1024 - l = "GB" -- hmmm - end - end - end - return string.format("%7.2f%2s", b, l) + local l = "B" + if b > 1024 then + b = b / 1024 + l = "KB" + if b > 1024 then + b = b / 1024 + l = "MB" + if b > 1024 then + b = b / 1024 + l = "GB" -- hmmm + end + end + end + return string.format("%7.2f%2s", b, l) end -- returns a string with the current state of the download local remaining_s = "%s received, %s/s throughput, %2.0f%% done, %s remaining" local elapsed_s = "%s received, %s/s throughput, %s elapsed " function gauge(got, delta, size) - local rate = got / delta - if size and size >= 1 then - return string.format(remaining_s, nicesize(got), nicesize(rate), - 100*got/size, nicetime((size-got)/rate)) - else - return string.format(elapsed_s, nicesize(got), - nicesize(rate), nicetime(delta)) - end + local rate = got / delta + if size and size >= 1 then + return string.format(remaining_s, nicesize(got), nicesize(rate), + 100*got/size, nicetime((size-got)/rate)) + else + return string.format(elapsed_s, nicesize(got), + nicesize(rate), nicetime(delta)) + end end -- creates a new instance of a receive_cb that saves to disk @@ -89,10 +89,10 @@ end -- determines the size of a http file function gethttpsize(u) - local r, c, h = http.request {method = "HEAD", url = u} - if c == 200 then - return tonumber(h["content-length"]) - end + local r, c, h = http.request {method = "HEAD", url = u} + if c == 200 then + return tonumber(h["content-length"]) + end end -- downloads a file using the http protocol @@ -101,7 +101,7 @@ function getbyhttp(u, file) -- only print feedback if output is not stdout if file then save = ltn12.sink.chain(stats(gethttpsize(u)), save) end local r, c, h, s = http.request {url = u, sink = save } - if c ~= 200 then io.stderr:write(s or c, "\n") end + if c ~= 200 then io.stderr:write(s or c, "\n") end end -- downloads a file using the ftp protocol @@ -114,29 +114,29 @@ function getbyftp(u, file) gett.sink = save gett.type = "i" local ret, err = ftp.get(gett) - if err then print(err) end + if err then print(err) end end -- determines the scheme function getscheme(u) - -- this is an heuristic to solve a common invalid url poblem - if not string.find(u, "//") then u = "//" .. u end - local parsed = url.parse(u, {scheme = "http"}) - return parsed.scheme + -- this is an heuristic to solve a common invalid url poblem + if not string.find(u, "//") then u = "//" .. u end + local parsed = url.parse(u, {scheme = "http"}) + return parsed.scheme end -- gets a file either by http or ftp, saving asfunction get(u, name) local fout = name and io.open(name, "wb") - local scheme = getscheme(u) - if scheme == "ftp" then getbyftp(u, fout) - elseif scheme == "http" then getbyhttp(u, fout) - else print("unknown scheme" .. scheme) end + local scheme = getscheme(u) + if scheme == "ftp" then getbyftp(u, fout) + elseif scheme == "http" then getbyhttp(u, fout) + else print("unknown scheme" .. scheme) end end -- main program arg = arg or {} if table.getn(arg) < 1 then - io.write("Usage:\n lua get.lua [ ]\n") - os.exit(1) + io.write("Usage:\n lua get.lua [ ]\n") + os.exit(1) else get(arg[1], arg[2]) end diff --git a/etc/lp.lua b/etc/lp.lua index 3757e2d..f067604 100644 --- a/etc/lp.lua +++ b/etc/lp.lua @@ -268,11 +268,11 @@ send = socket.protect(function(option) local class = string.sub(option.class or localip or localhost,1,31) local _,_,ctlfn = string.find(file,".*[%/%\\](.*)") ctlfn = string.sub(ctlfn or file,1,131) - local cfile = - string.format("H%-s\nC%-s\nJ%-s\nP%-s\n%.1s%-s\nU%-s\nN%-s\n", - localhost, + local cfile = + string.format("H%-s\nC%-s\nJ%-s\nP%-s\n%.1s%-s\nU%-s\nN%-s\n", + localhost, class, - option.job or "LuaSocket", + option.job or "LuaSocket", user, fmt, lpfile, lpfile, diff --git a/etc/tftp.lua b/etc/tftp.lua index c028b20..4051e74 100644 --- a/etc/tftp.lua +++ b/etc/tftp.lua @@ -35,18 +35,18 @@ local OP_INV = {"RRQ", "WRQ", "DATA", "ACK", "ERROR"} -- Packet creation functions ----------------------------------------------------------------------------- local function RRQ(source, mode) - return char(0, OP_RRQ) .. source .. char(0) .. mode .. char(0) + return char(0, OP_RRQ) .. source .. char(0) .. mode .. char(0) end local function WRQ(source, mode) - return char(0, OP_RRQ) .. source .. char(0) .. mode .. char(0) + return char(0, OP_RRQ) .. source .. char(0) .. mode .. char(0) end local function ACK(block) - local low, high - low = math.mod(block, 256) - high = (block - low)/256 - return char(0, OP_ACK, high, low) + local low, high + low = math.mod(block, 256) + high = (block - low)/256 + return char(0, OP_ACK, high, low) end local function get_OP(dgram) @@ -58,16 +58,16 @@ end -- Packet analysis functions ----------------------------------------------------------------------------- local function split_DATA(dgram) - local block = byte(dgram, 3)*256 + byte(dgram, 4) - local data = string.sub(dgram, 5) - return block, data + local block = byte(dgram, 3)*256 + byte(dgram, 4) + local data = string.sub(dgram, 5) + return block, data end local function get_ERROR(dgram) - local code = byte(dgram, 3)*256 + byte(dgram, 4) - local msg - _,_, msg = string.find(dgram, "(.*)\000", 5) - return string.format("error code %d: %s", code, msg) + local code = byte(dgram, 3)*256 + byte(dgram, 4) + local msg + _,_, msg = string.find(dgram, "(.*)\000", 5) + return string.format("error code %d: %s", code, msg) end ----------------------------------------------------------------------------- @@ -77,40 +77,40 @@ local function tget(gett) local retries, dgram, sent, datahost, dataport, code local last = 0 socket.try(gett.host, "missing host") - local con = socket.try(socket.udp()) + local con = socket.try(socket.udp()) local try = socket.newtry(function() con:close() end) -- convert from name to ip if needed - gett.host = try(socket.dns.toip(gett.host)) - con:settimeout(1) + gett.host = try(socket.dns.toip(gett.host)) + con:settimeout(1) -- first packet gives data host/port to be used for data transfers local path = string.gsub(gett.path or "", "^/", "") path = url.unescape(path) retries = 0 - repeat - sent = try(con:sendto(RRQ(path, "octet"), gett.host, gett.port)) - dgram, datahost, dataport = con:receivefrom() + repeat + sent = try(con:sendto(RRQ(path, "octet"), gett.host, gett.port)) + dgram, datahost, dataport = con:receivefrom() retries = retries + 1 - until dgram or datahost ~= "timeout" or retries > 5 - try(dgram, datahost) + until dgram or datahost ~= "timeout" or retries > 5 + try(dgram, datahost) -- associate socket with data host/port - try(con:setpeername(datahost, dataport)) + try(con:setpeername(datahost, dataport)) -- default sink local sink = gett.sink or ltn12.sink.null() -- process all data packets - while 1 do + while 1 do -- decode packet - code = get_OP(dgram) - try(code ~= OP_ERROR, get_ERROR(dgram)) + code = get_OP(dgram) + try(code ~= OP_ERROR, get_ERROR(dgram)) try(code == OP_DATA, "unhandled opcode " .. code) -- get data packet parts - local block, data = split_DATA(dgram) + local block, data = split_DATA(dgram) -- if not repeated, write if block == last+1 then - try(sink(data)) + try(sink(data)) last = block end -- last packet brings less than 512 bytes of data - if string.len(data) < 512 then + if string.len(data) < 512 then try(con:send(ACK(block))) try(con:close()) try(sink(nil)) @@ -118,13 +118,13 @@ local function tget(gett) end -- get the next packet retries = 0 - repeat - sent = try(con:send(ACK(last))) - dgram, err = con:receive() + repeat + sent = try(con:send(ACK(last))) + dgram, err = con:receive() retries = retries + 1 - until dgram or err ~= "timeout" or retries > 5 - try(dgram, err) - end + until dgram or err ~= "timeout" or retries > 5 + try(dgram, err) + end end local default = { diff --git a/makefile b/makefile index a9ce34d..4275474 100644 --- a/makefile +++ b/makefile @@ -1,21 +1,13 @@ -PLAT= none -PLATS= macosx linux +PLAT?= macosx +PLATS= macosx linux win32 #------ # Hopefully no need to change anything below this line # all: $(PLAT) -none: - @echo "Please run" - @echo " make PLATFORM" - @echo "where PLATFORM is one of these:" - @echo " $(PLATS)" - -$(PLATS) install local clean: - cd src; $(MAKE) $@ - -dummy: +$(PLATS) none install local clean: + @cd src; $(MAKE) $@ test: dummy lua test/hello.lua diff --git a/src/buffer.c b/src/buffer.c index 363da3d..5be0faf 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -42,7 +42,7 @@ int buffer_open(lua_State *L) { * Initializes C structure \*-------------------------------------------------------------------------*/ void buffer_init(p_buffer buf, p_io io, p_timeout tm) { - buf->first = buf->last = 0; + buf->first = buf->last = 0; buf->io = io; buf->tm = tm; buf->received = buf->sent = 0; @@ -122,9 +122,15 @@ int buffer_meth_receive(lua_State *L, p_buffer buf) { if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b); else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b); else luaL_argcheck(L, 0, 2, "invalid receive pattern"); - /* get a fixed number of bytes (minus what was already partially - * received) */ - } else err = recvraw(buf, (size_t) lua_tonumber(L, 2)-size, &b); + /* get a fixed number of bytes (minus what was already partially + * received) */ + } else { + double n = lua_tonumber(L, 2); + size_t wanted = (size_t) n; + luaL_argcheck(L, n >= 0, 2, "invalid receive pattern"); + if (size == 0 || wanted > size) + err = recvraw(buf, wanted-size, &b); + } /* check if there was an error */ if (err != IO_DONE) { /* we can't push anyting in the stack before pushing the diff --git a/src/buffer.h b/src/buffer.h index 58838d1..1281bb3 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -29,8 +29,8 @@ typedef struct t_buffer_ { size_t sent, received; /* bytes sent, and bytes received */ p_io io; /* IO driver used for this buffer */ p_timeout tm; /* timeout management for this buffer */ - size_t first, last; /* index of first and last bytes of stored data */ - char data[BUF_SIZE]; /* storage space for buffer data */ + size_t first, last; /* index of first and last bytes of stored data */ + char data[BUF_SIZE]; /* storage space for buffer data */ } t_buffer; typedef t_buffer *p_buffer; diff --git a/src/ftp.lua b/src/ftp.lua index f27e838..c90a65c 100644 --- a/src/ftp.lua +++ b/src/ftp.lua @@ -212,8 +212,8 @@ local function tput(putt) end local default = { - path = "/", - scheme = "ftp" + path = "/", + scheme = "ftp" } local function parse(u) diff --git a/src/inet.c b/src/inet.c index 32f0cd2..862288c 100644 --- a/src/inet.c +++ b/src/inet.c @@ -213,7 +213,7 @@ const char *inet_tryconnect(p_socket ps, const char *address, memset(&remote, 0, sizeof(remote)); remote.sin_family = AF_INET; remote.sin_port = htons(port); - if (strcmp(address, "*")) { + if (strcmp(address, "*")) { if (!inet_aton(address, &remote.sin_addr)) { struct hostent *hp = NULL; struct in_addr **addr; @@ -248,7 +248,6 @@ const char *inet_trybind(p_socket ps, const char *address, unsigned short port) memcpy(&local.sin_addr, *addr, sizeof(struct in_addr)); } err = socket_bind(ps, (SA *) &local, sizeof(local)); - if (err != IO_DONE) socket_destroy(ps); return socket_strerror(err); } diff --git a/src/makefile b/src/makefile index 3351997..701feb3 100644 --- a/src/makefile +++ b/src/makefile @@ -1,8 +1,13 @@ -PLAT = none +PLAT?=macosx + INSTALL_DATA=cp INSTALL_EXEC=cp -INSTALL_TOP= /opt/local -LUAINC= $(LUAINC_$(PLAT)) +INSTALL_TOP=/opt/local + +LUAINC_macosx=/opt/local/include +LUAINC_linux=/usr/include/lua5.1 +LUAINC_win32="../../lua-5.1.3/src" +LUALIB_win32="../../lua-5.1.3" #------ # Install directories @@ -15,40 +20,76 @@ INSTALL_MIME_SHARE=$(INSTALL_TOP_SHARE)/mime INSTALL_MIME_LIB=$(INSTALL_TOP_LIB)/mime #------ -# Output file names +# Supported platforms # -EXT=so -SOCKET_V=2.0.3 -MIME_V=1.0.3 -SOCKET_SO=socket.$(EXT).$(SOCKET_V) -MIME_SO=mime.$(EXT).$(MIME_V) -UNIX_SO=unix.$(EXT) +PLATS= macosx linux win32 #------ # Compiler and linker settings # for Mac OS X -LUAINC_macosx= -I/opt/local/include +SO_macosx=so +O_macosx=o CC_macosx=gcc DEF_macosx= -DLUASOCKET_DEBUG -DUNIX_HAS_SUN_LEN \ -DLUASOCKET_API='__attribute__((visibility("default")))' \ -DMIME_API='__attribute__((visibility("default")))' -CFLAGS_macosx= $(LUAINC) $(COMPAT) $(DEF) -pedantic -Wall -O2 -fno-common \ +CFLAGS_macosx= -I$(LUAINC) $(DEF) -pedantic -Wall -O2 -fno-common \ -fvisibility=hidden -LDFLAGS_macosx= -bundle -undefined dynamic_lookup +LDFLAGS_macosx= -bundle -undefined dynamic_lookup -o LD_macosx= export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc +SOCKET_macosx=usocket.o #------ # Compiler and linker settings # for Linux -LUAINC_linux= -I/usr/local/include/lua5.1 +SO_linux=so +O_linux=o CC_linux=gcc DEF_linux=-DLUASOCKET_DEBUG \ -DLUASOCKET_API='__attribute__((visibility("default")))' \ -DMIME_API='__attribute__((visibility("default")))' -CFLAGS_linux= $(LUAINC) $(DEF) -pedantic -Wall -O2 -fpic \ +CFLAGS_linux= -I$(LUAINC) $(DEF) -pedantic -Wall -O2 -fpic \ -fvisibility=hidden -LDFLAGS_linux=-O -shared -fpic -LD_linux= gcc +LDFLAGS_linux=-O -shared -fpic -o +LD_linux=gcc +SOCKET_linux=usocket.o + +#------ +# Compiler and linker settings +# for Win32 +SO_win32=dll +O_win32=obj +CC_win32=cl +DEF_win32= /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" \ + /D "LUASOCKET_API=__declspec(dllexport)" /D "LUASOCKET_DEBUG" \ + /D "_CRT_SECURE_NO_WARNINGS" /D "_WINDLL" +CFLAGS_win32=/I$(LUAINC) $(DEF) /O2 /Ot /MD /W3 /nologo +LDFLAGS_win32= /nologo /link /NOLOGO /DLL /INCREMENTAL:NO \ + /LIBPATH:$(LUALIB) \ + /MANIFEST \ + /MANIFESTFILE:"intermediate.manifest" \ + /MANIFESTUAC:"level='asInvoker' uiAccess='false'" \ + /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /DYNAMICBASE:NO \ + /MACHINE:X86 ws2_32.lib lua5.1.lib /OUT: +LD_win32=cl +SOCKET_win32=wsocket.obj + +.SUFFIXES: .obj + +.c.obj: + $(CC) $(CFLAGS) /Fo"$@" /c $< + +#------ +# Output file names +# +SO=$(SO_$(PLAT)) +O=$(O_$(PLAT)) +SOCKET_V=2.0.3 +MIME_V=1.0.3 +SOCKET_SO=socket.$(SO).$(SOCKET_V) +MIME_SO=mime.$(SO).$(MIME_V) +UNIX_SO=unix.$(SO) +SOCKET=$(SOCKET_$(PLAT)) #------ # Settings selected for platform @@ -58,46 +99,48 @@ DEF=$(DEF_$(PLAT)) CFLAGS=$(CFLAGS_$(PLAT)) LDFLAGS=$(LDFLAGS_$(PLAT)) LD=$(LD_$(PLAT)) +LUAINC= $(LUAINC_$(PLAT)) +LUALIB= $(LUALIB_$(PLAT)) #------ # Modules belonging to socket-core # SOCKET_OBJS= \ - luasocket.o \ - timeout.o \ - buffer.o \ - io.o \ - auxiliar.o \ - options.o \ - inet.o \ - usocket.o \ - except.o \ - select.o \ - tcp.o \ - udp.o + luasocket.$(O) \ + timeout.$(O) \ + buffer.$(O) \ + io.$(O) \ + auxiliar.$(O) \ + options.$(O) \ + inet.$(O) \ + $(SOCKET) \ + except.$(O) \ + select.$(O) \ + tcp.$(O) \ + udp.$(O) #------ # Modules belonging mime-core # MIME_OBJS= \ - mime.o + mime.$(O) #------ # Modules belonging unix (local domain sockets) # -UNIX_OBJS:=\ - buffer.o \ - auxiliar.o \ - options.o \ - timeout.o \ - io.o \ - usocket.o \ - unix.o +UNIX_OBJS=\ + buffer.$(O) \ + auxiliar.$(O) \ + options.$(O) \ + timeout.$(O) \ + io.$(O) \ + usocket.$(O) \ + unix.$(O) #------ # Files to install # -TO_SOCKET_SHARE:= \ +TO_SOCKET_SHARE= \ http.lua \ url.lua \ tp.lua \ @@ -105,33 +148,41 @@ TO_SOCKET_SHARE:= \ headers.lua \ smtp.lua -TO_TOP_SHARE:= \ +TO_TOP_SHARE= \ ltn12.lua \ socket.lua \ mime.lua +#------ +# Targets +# default: $(PLAT) macosx: $(MAKE) all PLAT=macosx +win32: + $(MAKE) all PLAT=win32 + linux: $(MAKE) all PLAT=linux none: - @echo "Please choose a platform:" + @echo "Please run" + @echo " make PLATFORM" + @echo "where PLATFORM is one of these:" @echo " $(PLATS)" all: $(SOCKET_SO) $(MIME_SO) $(SOCKET_SO): $(SOCKET_OBJS) - $(LD) $(LDFLAGS) -o $@ $(SOCKET_OBJS) + $(LD) $(SOCKET_OBJS) $(LDFLAGS)$@ $(MIME_SO): $(MIME_OBJS) - $(LD) $(LDFLAGS) -o $@ $(MIME_OBJS) + $(LD) $(MIME_OBJS) $(LDFLAGS)$@ $(UNIX_SO): $(UNIX_OBJS) - $(LD) $(LDFLAGS) -o $@ $(UNIX_OBJS) + $(LD) $(UNIX_OBJS) $(LDFLAGS)$@ install: mkdir -p $(INSTALL_TOP_SHARE) @@ -139,9 +190,9 @@ install: mkdir -p $(INSTALL_SOCKET_SHARE) $(INSTALL_DATA) $(TO_SOCKET_SHARE) $(INSTALL_SOCKET_SHARE) mkdir -p $(INSTALL_SOCKET_LIB) - $(INSTALL_EXEC) $(SOCKET_SO) $(INSTALL_SOCKET_LIB)/core.$(EXT) + $(INSTALL_EXEC) $(SOCKET_SO) $(INSTALL_SOCKET_LIB)/core.$(SO) mkdir -p $(INSTALL_MIME_LIB) - $(INSTALL_EXEC) $(MIME_SO) $(INSTALL_MIME_LIB)/core.$(EXT) + $(INSTALL_EXEC) $(MIME_SO) $(INSTALL_MIME_LIB)/core.$(SO) local: $(MAKE) install INSTALL_TOP_LIB=.. INSTALL_TOP_SHARE=.. @@ -155,24 +206,24 @@ clean: #------ # List of dependencies # -auxiliar.o: auxiliar.c auxiliar.h -buffer.o: buffer.c buffer.h io.h timeout.h -except.o: except.c except.h -inet.o: inet.c inet.h socket.h io.h timeout.h usocket.h -io.o: io.c io.h timeout.h -luasocket.o: luasocket.c luasocket.h auxiliar.h except.h \ +auxiliar.$(O): auxiliar.c auxiliar.h +buffer.$(O): buffer.c buffer.h io.h timeout.h +except.$(O): except.c except.h +inet.$(O): inet.c inet.h socket.h io.h timeout.h usocket.h +io.$(O): io.c io.h timeout.h +luasocket.$(O): luasocket.c luasocket.h auxiliar.h except.h \ timeout.h buffer.h io.h inet.h socket.h usocket.h tcp.h \ udp.h select.h -mime.o: mime.c mime.h -options.o: options.c auxiliar.h options.h socket.h io.h \ +mime.$(O): mime.c mime.h +options.$(O): options.c auxiliar.h options.h socket.h io.h \ timeout.h usocket.h inet.h -select.o: select.c socket.h io.h timeout.h usocket.h select.h -tcp.o: tcp.c auxiliar.h socket.h io.h timeout.h usocket.h \ +select.$(O): select.c socket.h io.h timeout.h usocket.h select.h +tcp.$(O): tcp.c auxiliar.h socket.h io.h timeout.h usocket.h \ inet.h options.h tcp.h buffer.h -timeout.o: timeout.c auxiliar.h timeout.h -udp.o: udp.c auxiliar.h socket.h io.h timeout.h usocket.h \ +timeout.$(O): timeout.c auxiliar.h timeout.h +udp.$(O): udp.c auxiliar.h socket.h io.h timeout.h usocket.h \ inet.h options.h udp.h -unix.o: unix.c auxiliar.h socket.h io.h timeout.h usocket.h \ +unix.$(O): unix.c auxiliar.h socket.h io.h timeout.h usocket.h \ options.h unix.h buffer.h -usocket.o: usocket.c socket.h io.h timeout.h usocket.h -wsocket.o: wsocket.c socket.h io.h timeout.h usocket.h +usocket.$(O): usocket.c socket.h io.h timeout.h usocket.h +wsocket.$(O): wsocket.c socket.h io.h timeout.h usocket.h diff --git a/src/mbox.lua b/src/mbox.lua index ce6537c..b7d4a2a 100644 --- a/src/mbox.lua +++ b/src/mbox.lua @@ -5,10 +5,10 @@ mbox = Public function Public.split_message(message_s) local message = {} message_s = string.gsub(message_s, "\r\n", "\n") - string.gsub(message_s, "^(.-\n)\n", function (h) message.headers = h end) - string.gsub(message_s, "^.-\n\n(.*)", function (b) message.body = b end) + string.gsub(message_s, "^(.-\n)\n", function (h) message.headers = h end) + string.gsub(message_s, "^.-\n\n(.*)", function (b) message.body = b end) if not message.body then - string.gsub(message_s, "^\n(.*)", function (b) message.body = b end) + string.gsub(message_s, "^\n(.*)", function (b) message.body = b end) end if not message.headers and not message.body then message.headers = message_s @@ -54,30 +54,30 @@ function Public.parse_from(from) name = name or "" address = address or "" if name == "" then name = address end - name = string.gsub(name, '"', "") + name = string.gsub(name, '"', "") return name, address end function Public.split_mbox(mbox_s) - mbox = {} - mbox_s = string.gsub(mbox_s, "\r\n", "\n") .."\n\nFrom \n" - local nj, i, j = 1, 1, 1 - while 1 do - i, nj = string.find(mbox_s, "\n\nFrom .-\n", j) - if not i then break end - local message = string.sub(mbox_s, j, i-1) - table.insert(mbox, message) - j = nj+1 - end - return mbox + mbox = {} + mbox_s = string.gsub(mbox_s, "\r\n", "\n") .."\n\nFrom \n" + local nj, i, j = 1, 1, 1 + while 1 do + i, nj = string.find(mbox_s, "\n\nFrom .-\n", j) + if not i then break end + local message = string.sub(mbox_s, j, i-1) + table.insert(mbox, message) + j = nj+1 + end + return mbox end function Public.parse(mbox_s) - local mbox = Public.split_mbox(mbox_s) - for i = 1, table.getn(mbox) do - mbox[i] = Public.parse_message(mbox[i]) - end - return mbox + local mbox = Public.split_mbox(mbox_s) + for i = 1, table.getn(mbox) do + mbox[i] = Public.parse_message(mbox[i]) + end + return mbox end function Public.parse_message(message_s) diff --git a/src/tp.lua b/src/tp.lua index 5fd8d22..46f7f64 100644 --- a/src/tp.lua +++ b/src/tp.lua @@ -106,7 +106,7 @@ end -- closes the underlying c function metat.__index:close() self.c:close() - return 1 + return 1 end -- connect with server and return c object diff --git a/src/url.lua b/src/url.lua index 18e5ab2..7623557 100644 --- a/src/url.lua +++ b/src/url.lua @@ -40,25 +40,25 @@ end -- escaped representation of string binary ----------------------------------------------------------------------------- local function make_set(t) - local s = {} - for i,v in base.ipairs(t) do - s[t[i]] = 1 - end - return s + local s = {} + for i,v in base.ipairs(t) do + s[t[i]] = 1 + end + return s end -- these are allowed withing a path segment, along with alphanum -- other characters must be escaped local segment_set = make_set { "-", "_", ".", "!", "~", "*", "'", "(", - ")", ":", "@", "&", "=", "+", "$", ",", + ")", ":", "@", "&", "=", "+", "$", ",", } local function protect_segment(s) - return string.gsub(s, "([^A-Za-z0-9_])", function (c) - if segment_set[c] then return c - else return string.format("%%%02x", string.byte(c)) end - end) + return string.gsub(s, "([^A-Za-z0-9_])", function (c) + if segment_set[c] then return c + else return string.format("%%%02x", string.byte(c)) end + end) end ----------------------------------------------------------------------------- @@ -182,20 +182,26 @@ function build(parsed) local url = build_path(ppath) if parsed.params then url = url .. ";" .. parsed.params end if parsed.query then url = url .. "?" .. parsed.query end - local authority = parsed.authority - if parsed.host then - authority = parsed.host - if parsed.port then authority = authority .. ":" .. parsed.port end - local userinfo = parsed.userinfo - if parsed.user then - userinfo = parsed.user - if parsed.password then - userinfo = userinfo .. ":" .. parsed.password - end - end - if userinfo then authority = userinfo .. "@" .. authority end - end - if authority then url = "//" .. authority .. url end + local authority = parsed.authority + if parsed.host then + authority = parsed.host + if parsed.port then authority = authority .. ":" .. parsed.port end + local userinfo = parsed.userinfo + if parsed.user then + userinfo = parsed.user + if parsed.password then + userinfo = userinfo .. ":" .. parsed.password + end + end + if userinfo then authority = userinfo .. "@" .. authority end + end + if authority then + if string.sub(url, 1, 1) == "/" then + url = "//" .. authority .. url + else + url = "//" .. authority .. "/" .. url + end + end if parsed.scheme then url = parsed.scheme .. ":" .. url end if parsed.fragment then url = url .. "#" .. parsed.fragment end -- url = string.gsub(url, "%s", "") @@ -211,8 +217,8 @@ end -- corresponding absolute url ----------------------------------------------------------------------------- function absolute(base_url, relative_url) + local base_parsed = base_url if base.type(base_url) == "table" then - base_parsed = base_url base_url = build(base_parsed) else base_parsed = parse(base_url) @@ -250,16 +256,16 @@ end -- segment: a table with one entry per segment ----------------------------------------------------------------------------- function parse_path(path) - local parsed = {} - path = path or "" - --path = string.gsub(path, "%s", "") - string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end) - for i = 1, table.getn(parsed) do - parsed[i] = unescape(parsed[i]) - end - if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end - if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end - return parsed + local parsed = {} + path = path or "" + --path = string.gsub(path, "%s", "") + string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end) + for i = 1, table.getn(parsed) do + parsed[i] = unescape(parsed[i]) + end + if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end + if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end + return parsed end ----------------------------------------------------------------------------- @@ -271,27 +277,27 @@ end -- path: corresponding path stringing ----------------------------------------------------------------------------- function build_path(parsed, unsafe) - local path = "" - local n = table.getn(parsed) - if unsafe then - for i = 1, n-1 do - path = path .. parsed[i] - path = path .. "/" - end - if n > 0 then - path = path .. parsed[n] - if parsed.is_directory then path = path .. "/" end - end - else - for i = 1, n-1 do - path = path .. protect_segment(parsed[i]) - path = path .. "/" - end - if n > 0 then - path = path .. protect_segment(parsed[n]) - if parsed.is_directory then path = path .. "/" end - end - end - if parsed.is_absolute then path = "/" .. path end - return path + local path = "" + local n = table.getn(parsed) + if unsafe then + for i = 1, n-1 do + path = path .. parsed[i] + path = path .. "/" + end + if n > 0 then + path = path .. parsed[n] + if parsed.is_directory then path = path .. "/" end + end + else + for i = 1, n-1 do + path = path .. protect_segment(parsed[i]) + path = path .. "/" + end + if n > 0 then + path = path .. protect_segment(parsed[n]) + if parsed.is_directory then path = path .. "/" end + end + end + if parsed.is_absolute then path = "/" .. path end + return path end diff --git a/src/usocket.c b/src/usocket.c index 2c30b9a..1ba1043 100644 --- a/src/usocket.c +++ b/src/usocket.c @@ -30,9 +30,9 @@ int socket_waitfd(p_socket ps, int sw, p_timeout tm) { pfd.revents = 0; if (timeout_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ do { - int t = (int)(timeout_getretry(tm)*1e3); - ret = poll(&pfd, 1, t >= 0? t: -1); - } while (ret == -1 && errno == EINTR); + int t = (int)(timeout_getretry(tm)*1e3); + ret = poll(&pfd, 1, t >= 0? t: -1); + } while (ret == -1 && errno == EINTR); if (ret == -1) return errno; if (ret == 0) return IO_TIMEOUT; if (sw == WAITFD_C && (pfd.revents & (POLLIN|POLLERR))) return IO_CLOSED; diff --git a/src/wsocket.c b/src/wsocket.c index e247777..2d07904 100644 --- a/src/wsocket.c +++ b/src/wsocket.c @@ -54,7 +54,7 @@ int socket_waitfd(p_socket ps, int sw, p_timeout tm) { if (timeout_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ if (sw & WAITFD_R) { FD_ZERO(&rfds); - FD_SET(*ps, &rfds); + FD_SET(*ps, &rfds); rp = &rfds; } if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(*ps, &wfds); wp = &wfds; } @@ -207,7 +207,7 @@ int socket_send(p_socket ps, const char *data, size_t count, /* loop until we send something or we give up on error */ for ( ;; ) { /* try to send something */ - int put = send(*ps, data, (int) count, 0); + int put = send(*ps, data, (int) count, 0); /* if we sent something, we are done */ if (put > 0) { *sent = put; @@ -346,8 +346,8 @@ const char *socket_strerror(int err) { } const char *socket_ioerror(p_socket ps, int err) { - (void) ps; - return socket_strerror(err); + (void) ps; + return socket_strerror(err); } static const char *wstrerror(int err) { diff --git a/test/ftptest.lua b/test/ftptest.lua index f35e16f..fb13326 100644 --- a/test/ftptest.lua +++ b/test/ftptest.lua @@ -82,10 +82,10 @@ print("ok") io.write("testing parameter overriding: ") local back = {} ret, err = ftp.get{ - url = "//stupid:mistake@" .. host .. "/index.html", - user = "luasocket", - password = "pedrovian", - type = "i", + url = "//stupid:mistake@" .. host .. "/index.html", + user = "luasocket", + password = "pedrovian", + type = "i", sink = ltn12.sink.table(back) } assert(ret and not err and table.concat(back) == index, err) diff --git a/test/httptest.lua b/test/httptest.lua index 9d50a14..614acf3 100644 --- a/test/httptest.lua +++ b/test/httptest.lua @@ -34,28 +34,28 @@ index_file = "index.html" index = readfile(index_file) local check_result = function(response, expect, ignore) - for i,v in pairs(response) do - if not ignore[i] then - if v ~= expect[i] then + for i,v in pairs(response) do + if not ignore[i] then + if v ~= expect[i] then local f = io.open("err", "w") f:write(tostring(v), "\n\n versus\n\n", tostring(expect[i])) f:close() fail(i .. " differs!") end - end - end - for i,v in pairs(expect) do - if not ignore[i] then - if v ~= response[i] then + end + end + for i,v in pairs(expect) do + if not ignore[i] then + if v ~= response[i] then local f = io.open("err", "w") f:write(tostring(response[i]), "\n\n versus\n\n", tostring(v)) v = string.sub(type(v) == "string" and v or "", 1, 70) f:close() fail(i .. " differs!") end - end - end - print("ok") + end + end + print("ok") end local check_request = function(request, expect, ignore) @@ -63,7 +63,7 @@ local check_request = function(request, expect, ignore) if not request.sink then request.sink, t = ltn12.sink.table() end request.source = request.source or (request.body and ltn12.source.string(request.body)) - local response = {} + local response = {} response.code, response.headers, response.status = socket.skip(1, http.request(request)) if t and table.getn(t) > 0 then response.body = table.concat(t) end @@ -90,15 +90,15 @@ else fail("failed!") end ------------------------------------------------------------------------ io.write("testing document retrieval: ") request = { - url = "http://" .. host .. prefix .. "/index.html" + url = "http://" .. host .. prefix .. "/index.html" } expect = { - body = index, - code = 200 + body = index, + code = 200 } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) @@ -111,9 +111,9 @@ expect = { code = 302 } ignore = { - status = 1, - headers = 1, - body = 1 + status = 1, + headers = 1, + body = 1 } check_request(request, expect, ignore) @@ -144,19 +144,19 @@ check_request(request, expect, ignore) io.write("testing post method: ") -- wanted to test chunked post, but apache doesn't support it... request = { - url = "http://" .. host .. cgiprefix .. "/cat", - method = "POST", - body = index, + url = "http://" .. host .. cgiprefix .. "/cat", + method = "POST", + body = index, -- remove content-length header to send chunked body headers = { ["content-length"] = string.len(index) } } expect = { - body = index, - code = 200 + body = index, + code = 200 } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) @@ -164,19 +164,19 @@ check_request(request, expect, ignore) --[[ io.write("testing proxy with post method: ") request = { - url = "http://" .. host .. cgiprefix .. "/cat", - method = "POST", - body = index, + url = "http://" .. host .. cgiprefix .. "/cat", + method = "POST", + body = index, headers = { ["content-length"] = string.len(index) }, proxy= proxy } expect = { - body = index, - code = 200 + body = index, + code = 200 } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) ]] @@ -190,18 +190,18 @@ print("ok") ------------------------------------------------------------------------ io.write("testing ltn12.(sink|source).file: ") request = { - url = "http://" .. host .. cgiprefix .. "/cat", - method = "POST", - source = ltn12.source.file(io.open(index_file, "rb")), + url = "http://" .. host .. cgiprefix .. "/cat", + method = "POST", + source = ltn12.source.file(io.open(index_file, "rb")), sink = ltn12.sink.file(io.open(index_file .. "-back", "wb")), headers = { ["content-length"] = string.len(index) } } expect = { - code = 200 + code = 200 } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) back = readfile(index_file .. "-back") @@ -231,19 +231,19 @@ local sink = ltn12.sink.chain( ) request = { - url = "http://" .. host .. cgiprefix .. "/cat", - method = "POST", - source = source, + url = "http://" .. host .. cgiprefix .. "/cat", + method = "POST", + source = source, sink = sink, headers = { ["content-length"] = b64length(string.len(index)) } } expect = { - code = 200 + code = 200 } ignore = { body_cb = 1, - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) back = readfile(index_file .. "-back") @@ -253,15 +253,15 @@ os.remove(index_file .. "-back") ------------------------------------------------------------------------ io.write("testing http redirection: ") request = { - url = "http://" .. host .. prefix + url = "http://" .. host .. prefix } expect = { - body = index, - code = 200 + body = index, + code = 200 } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) @@ -269,16 +269,16 @@ check_request(request, expect, ignore) --[[ io.write("testing proxy with redirection: ") request = { - url = "http://" .. host .. prefix, + url = "http://" .. host .. prefix, proxy = proxy } expect = { - body = index, - code = 200 + body = index, + code = 200 } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) ]] @@ -293,104 +293,104 @@ expect = { } ignore = { body = 1, - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) ------------------------------------------------------------------------ io.write("testing http redirection failure: ") request = { - url = "http://" .. host .. prefix, - redirect = false + url = "http://" .. host .. prefix, + redirect = false } expect = { code = 301 } ignore = { body = 1, - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) ------------------------------------------------------------------------ io.write("testing document not found: ") request = { - url = "http://" .. host .. "/wrongdocument.html" + url = "http://" .. host .. "/wrongdocument.html" } expect = { - code = 404 + code = 404 } ignore = { body = 1, - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) ------------------------------------------------------------------------ io.write("testing auth failure: ") request = { - url = "http://" .. host .. prefix .. "/auth/index.html" + url = "http://" .. host .. prefix .. "/auth/index.html" } expect = { - code = 401 + code = 401 } ignore = { body = 1, - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) ------------------------------------------------------------------------ io.write("testing manual basic auth: ") request = { - url = "http://" .. host .. prefix .. "/auth/index.html", - headers = { - authorization = "Basic " .. (mime.b64("luasocket:password")) - } + url = "http://" .. host .. prefix .. "/auth/index.html", + headers = { + authorization = "Basic " .. (mime.b64("luasocket:password")) + } } expect = { - code = 200, - body = index + code = 200, + body = index } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) ------------------------------------------------------------------------ io.write("testing automatic basic auth: ") request = { - url = "http://luasocket:password@" .. host .. prefix .. "/auth/index.html" + url = "http://luasocket:password@" .. host .. prefix .. "/auth/index.html" } expect = { - code = 200, - body = index + code = 200, + body = index } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) ------------------------------------------------------------------------ io.write("testing auth info overriding: ") request = { - url = "http://really:wrong@" .. host .. prefix .. "/auth/index.html", - user = "luasocket", - password = "password" + url = "http://really:wrong@" .. host .. prefix .. "/auth/index.html", + user = "luasocket", + password = "password" } expect = { - code = 200, - body = index + code = 200, + body = index } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) @@ -400,12 +400,12 @@ request = { url = "http://" .. host .. cgiprefix .. "/cat-index-html" } expect = { - body = index, - code = 200 + body = index, + code = 200 } ignore = { - status = 1, - headers = 1 + status = 1, + headers = 1 } check_request(request, expect, ignore) diff --git a/test/smtptest.lua b/test/smtptest.lua index d0c938c..5f0e0e5 100644 --- a/test/smtptest.lua +++ b/test/smtptest.lua @@ -19,11 +19,11 @@ local parse = mbox.parse dofile("testsupport.lua") local total = function() - local t = 0 - for i = 1, table.getn(sent) do - t = t + sent[i].count - end - return t + local t = 0 + for i = 1, table.getn(sent) do + t = t + sent[i].count + end + return t end local similar = function(s1, s2) @@ -39,14 +39,14 @@ local fail = function(s) end local readfile = function(name) - local f = io.open(name, "r") - if not f then + local f = io.open(name, "r") + if not f then fail("unable to open file!") return nil end - local s = f:read("*a") - f:close() - return s + local s = f:read("*a") + f:close() + return s end local empty = function() @@ -62,7 +62,7 @@ end local get = function() local s = "" for i,v in ipairs(files) do - s = s .. "\n" .. readfile(v) + s = s .. "\n" .. readfile(v) end return s end @@ -82,40 +82,40 @@ local check_body = function(sent, got) end local check = function(sent, m) - io.write("checking ", m.headers.title, ": ") - for i = 1, table.getn(sent) do - local s = sent[i] - if s.title == m.headers.title and s.count > 0 then - check_headers(s.headers, m.headers) - check_body(s.body, m.body) - s.count = s.count - 1 - print("ok") - return - end - end - fail("not found") + io.write("checking ", m.headers.title, ": ") + for i = 1, table.getn(sent) do + local s = sent[i] + if s.title == m.headers.title and s.count > 0 then + check_headers(s.headers, m.headers) + check_body(s.body, m.body) + s.count = s.count - 1 + print("ok") + return + end + end + fail("not found") end local insert = function(sent, message) - if type(message.rcpt) == "table" then - message.count = table.getn(message.rcpt) - else message.count = 1 end - message.headers = message.headers or {} - message.headers.title = message.title - table.insert(sent, message) + if type(message.rcpt) == "table" then + message.count = table.getn(message.rcpt) + else message.count = 1 end + message.headers = message.headers or {} + message.headers.title = message.title + table.insert(sent, message) end local mark = function() - local time = socket.time() + local time = socket.time() return { time = time } end local wait = function(sentinel, n) local to - io.write("waiting for ", n, " messages: ") + io.write("waiting for ", n, " messages: ") while 1 do - local mbox = parse(get()) - if n == table.getn(mbox) then break end + local mbox = parse(get()) + if n == table.getn(mbox) then break end if socket.time() - sentinel.time > 50 then to = 1 break @@ -124,8 +124,8 @@ local wait = function(sentinel, n) io.write(".") io.stdout:flush() end - if to then fail("timeout") - else print("ok") end + if to then fail("timeout") + else print("ok") end end local stuffed_body = [[ @@ -144,21 +144,21 @@ a lot of trouble. insert(sent, { from = from, rcpt = { - "luasocket@localhost", - "luasock3@dell-diego.cs.princeton.edu", - "luasock1@dell-diego.cs.princeton.edu" - }, - body = "multiple rcpt body", - title = "multiple rcpt", + "luasocket@localhost", + "luasock3@dell-diego.cs.princeton.edu", + "luasock1@dell-diego.cs.princeton.edu" + }, + body = "multiple rcpt body", + title = "multiple rcpt", }) insert(sent, { from = from, rcpt = { - "luasock2@localhost", - "luasock3", - "luasock1" - }, + "luasock2@localhost", + "luasock3", + "luasock1" + }, headers = { header1 = "header 1", header2 = "header 2", @@ -210,24 +210,24 @@ insert(sent, { io.write("testing host not found: ") local c, e = socket.connect("wrong.host", 25) local ret, err = socket.smtp.mail{ - from = from, - rcpt = rcpt, - server = "wrong.host" + from = from, + rcpt = rcpt, + server = "wrong.host" } if ret or e ~= err then fail("wrong error message") else print("ok") end io.write("testing invalid from: ") local ret, err = socket.smtp.mail{ - from = ' " " (( _ * ', - rcpt = rcpt, + from = ' " " (( _ * ', + rcpt = rcpt, } if ret or not err then fail("wrong error message") else print(err) end io.write("testing no rcpt: ") local ret, err = socket.smtp.mail{ - from = from, + from = from, } if ret or not err then fail("wrong error message") else print(err) end @@ -252,7 +252,7 @@ local mbox = parse(get()) print(table.getn(mbox) .. " messages found!") for i = 1, table.getn(mbox) do - check(sent, mbox[i]) + check(sent, mbox[i]) end print("passed all tests") diff --git a/test/testclnt.lua b/test/testclnt.lua index 1f03b10..4c2f211 100644 --- a/test/testclnt.lua +++ b/test/testclnt.lua @@ -3,15 +3,20 @@ local socket = require"socket" host = host or "localhost" port = port or "8383" -function pass(...) +function printf(...) local s = string.format(unpack(arg)) - io.stderr:write(s, "\n") + io.stderr:write(s) +end + +function pass(...) + printf(...) + io.stderr:write("\n") end function fail(...) - local s = string.format(unpack(arg)) - io.stderr:write("ERROR: ", s, "!\n") -socket.sleep(3) + io.stderr:write("ERROR: ") + printf(...) + io.stderr:write("!\n") os.exit() end @@ -80,7 +85,6 @@ io.stderr:write("----------------------------------------------\n", start = socket.gettime() function reconnect() - io.stderr:write("attempting data connection... ") if data then data:close() end remote [[ if data then data:close() data = nil end @@ -88,12 +92,11 @@ function reconnect() data:setoption("tcp-nodelay", true) ]] data, err = socket.connect(host, port) - if not data then fail(err) - else pass("connected!") end + if not data then fail(err) end data:setoption("tcp-nodelay", true) end -pass("attempting control connection...") +printf("attempting control connection...") control, err = socket.connect(host, port) if err then fail(err) else pass("connected!") end @@ -112,6 +115,7 @@ end ------------------------------------------------------------------------ function test_mixed(len) reconnect() + io.stderr:write("length " .. len .. ": ") local inter = math.ceil(len/4) local p1 = "unix " .. string.rep("x", inter) .. "line\n" local p2 = "dos " .. string.rep("y", inter) .. "line\r\n" @@ -139,6 +143,7 @@ end ------------------------------------------------------------------------ function test_asciiline(len) reconnect() + io.stderr:write("length " .. len .. ": ") local str, str10, back, err str = string.rep("x", math.mod(len, 10)) str10 = string.rep("aZb.c#dAe?", math.floor(len/10)) @@ -156,6 +161,7 @@ end ------------------------------------------------------------------------ function test_rawline(len) reconnect() + io.stderr:write("length " .. len .. ": ") local str, str10, back, err str = string.rep(string.char(47), math.mod(len, 10)) str10 = string.rep(string.char(120,21,77,4,5,0,7,36,44,100), @@ -174,6 +180,7 @@ end ------------------------------------------------------------------------ function test_raw(len) reconnect() + io.stderr:write("length " .. len .. ": ") local half = math.floor(len/2) local s1, s2, back, err s1 = string.rep("x", half) @@ -194,7 +201,7 @@ end function test_totaltimeoutreceive(len, tm, sl) reconnect() local str, err, partial - pass("%d bytes, %ds total timeout, %ds pause", len, tm, sl) + printf("%d bytes, %ds total timeout, %ds pause: ", len, tm, sl) remote (string.format ([[ data:settimeout(%d) str = string.rep('a', %d) @@ -215,7 +222,7 @@ end function test_totaltimeoutsend(len, tm, sl) reconnect() local str, err, total - pass("%d bytes, %ds total timeout, %ds pause", len, tm, sl) + printf("%d bytes, %ds total timeout, %ds pause: ", len, tm, sl) remote (string.format ([[ data:settimeout(%d) str = data:receive(%d) @@ -235,7 +242,7 @@ end function test_blockingtimeoutreceive(len, tm, sl) reconnect() local str, err, partial - pass("%d bytes, %ds blocking timeout, %ds pause", len, tm, sl) + printf("%d bytes, %ds blocking timeout, %ds pause: ", len, tm, sl) remote (string.format ([[ data:settimeout(%d) str = string.rep('a', %d) @@ -255,7 +262,7 @@ end function test_blockingtimeoutsend(len, tm, sl) reconnect() local str, err, total - pass("%d bytes, %ds blocking timeout, %ds pause", len, tm, sl) + printf("%d bytes, %ds blocking timeout, %ds pause: ", len, tm, sl) remote (string.format ([[ data:settimeout(%d) str = data:receive(%d) @@ -273,6 +280,7 @@ end ------------------------------------------------------------------------ function empty_connect() + printf("empty connect: ") reconnect() if data then data:close() data = nil end remote [[ @@ -284,7 +292,7 @@ function empty_connect() pass("ok") data = socket.connect(host, port) else - pass("gethostbyname returns localhost on empty string...") + pass("gethostbyname returns localhost on empty string...") end end @@ -311,7 +319,7 @@ function test_closed() local back, partial, err local str = 'little string' reconnect() - pass("trying read detection") + printf("trying read detection: ") remote (string.format ([[ data:send('%s') data:close() @@ -324,7 +332,7 @@ function test_closed() elseif str ~= partial then fail("didn't receive partial result.") else pass("graceful 'closed' received") end reconnect() - pass("trying write detection") + printf("trying write detection: ") remote [[ data:close() data = nil @@ -342,7 +350,6 @@ end ------------------------------------------------------------------------ function test_selectbugs() local r, s, e = socket.select(nil, nil, 0.1) -print(r, s, e) assert(type(r) == "table" and type(s) == "table" and (e == "timeout" or e == "error")) pass("both nil: ok") @@ -374,7 +381,7 @@ end ------------------------------------------------------------------------ function accept_timeout() - io.stderr:write("accept with timeout (if it hangs, it failed): ") + printf("accept with timeout (if it hangs, it failed): ") local s, e = socket.bind("*", 0, 0) assert(s, e) local t = socket.gettime() @@ -390,23 +397,22 @@ end ------------------------------------------------------------------------ function connect_timeout() - io.stderr:write("connect with timeout (if it hangs, it failed!): ") + printf("connect with timeout (if it hangs, it failed!): ") local t = socket.gettime() local c, e = socket.tcp() assert(c, e) c:settimeout(0.1) local t = socket.gettime() local r, e = c:connect("10.0.0.1", 81) -print(r, e) assert(not r, "should not connect") assert(socket.gettime() - t < 2, "took too long to give up.") c:close() - print("ok") + pass("ok") end ------------------------------------------------------------------------ function accept_errors() - io.stderr:write("not listening: ") + printf("not listening: ") local d, e = socket.bind("*", 0) assert(d, e); local c, e = socket.tcp(); @@ -415,26 +421,26 @@ function accept_errors() d:settimeout(2) local r, e = d:accept() assert(not r and e) - print("ok: ", e) - io.stderr:write("not supported: ") + pass("ok") + printf("not supported: ") local c, e = socket.udp() assert(c, e); d:setfd(c:getfd()) local r, e = d:accept() assert(not r and e) - print("ok: ", e) + pass("ok") end ------------------------------------------------------------------------ function connect_errors() - io.stderr:write("connection refused: ") + printf("connection refused: ") local c, e = socket.connect("localhost", 1); assert(not c and e) - print("ok: ", e) - io.stderr:write("host not found: ") + pass("ok") + printf("host not found: ") local c, e = socket.connect("host.is.invalid", 1); assert(not c and e, e) - print("ok: ", e) + pass("ok") end ------------------------------------------------------------------------ @@ -447,7 +453,7 @@ function rebind_test() r, e = s:bind("localhost", p) assert(not r, "managed to rebind!") assert(e) - print("ok: ", e) + pass("ok") end ------------------------------------------------------------------------ @@ -469,14 +475,14 @@ function getstats_test() assert(s == t, "sent count failed" .. tostring(s) .. "/" .. tostring(t)) end - print("ok") + pass("ok") end ------------------------------------------------------------------------ function test_nonblocking(size) reconnect() -print("Testing " .. 2*size .. " bytes") + printf("testing " .. 2*size .. " bytes: ") remote(string.format([[ data:send(string.rep("a", %d)) socket.sleep(0.5) @@ -508,7 +514,7 @@ remote(string.format([[ data:settimeout(-1) local back = data:receive(2*size) assert(back == str, "'" .. back .. "' vs '" .. str .. "'") - print("ok") + pass("ok") end ------------------------------------------------------------------------ @@ -516,7 +522,7 @@ function test_readafterclose() local back, partial, err local str = 'little string' reconnect() - pass("trying repeated '*a' pattern") + printf("trying repeated '*a' pattern") remote (string.format ([[ data:send('%s') data:close() @@ -526,9 +532,9 @@ function test_readafterclose() assert(back == str, "unexpected data read") back, err, partial = data:receive("*a") assert(back == nil and err == "closed", "should have returned 'closed'") - print("ok") + pass("ok") reconnect() - pass("trying active close before '*a'") + printf("trying active close before '*a'") remote (string.format ([[ data:close() data = nil @@ -536,9 +542,9 @@ function test_readafterclose() data:close() back, err, partial = data:receive("*a") assert(back == nil and err == "closed", "should have returned 'closed'") - print("ok") + pass("ok") reconnect() - pass("trying active close before '*l'") + printf("trying active close before '*l'") remote (string.format ([[ data:close() data = nil @@ -546,9 +552,9 @@ function test_readafterclose() data:close() back, err, partial = data:receive() assert(back == nil and err == "closed", "should have returned 'closed'") - print("ok") + pass("ok") reconnect() - pass("trying active close before raw 1") + printf("trying active close before raw 1") remote (string.format ([[ data:close() data = nil @@ -556,9 +562,9 @@ function test_readafterclose() data:close() back, err, partial = data:receive(1) assert(back == nil and err == "closed", "should have returned 'closed'") - print("ok") + pass("ok") reconnect() - pass("trying active close before raw 0") + printf("trying active close before raw 0") remote (string.format ([[ data:close() data = nil @@ -566,7 +572,7 @@ function test_readafterclose() data:close() back, err, partial = data:receive(0) assert(back == nil and err == "closed", "should have returned 'closed'") - print("ok") + pass("ok") end ------------------------------------------------------------------------ @@ -581,13 +587,29 @@ function test_writeafterclose() while not err do sent, err, errsent, time = data:send(str) end - print(sent, err, errsent, time) - print("ok") + assert(err == "closed", "should have returned 'closed'") + pass("ok") end ------------------------------------------------------------------------ ---test_writeafterclose() +function test_partialrecv() + local str = 'little string' + reconnect() +remote([[ + data:send("7890") +]]) + data:settimeout(1) + back, err = data:receive(10, "123456") + assert(back == "1234567890", "failed on exact mixed length") + back, err = data:receive(8, "87654321") + assert(back == "87654321", "failed on exact length") + back, err = data:receive(4, "87654321") + assert(back == "87654321", "failed on smaller length") + pass("ok") +end + +------------------------------------------------------------------------ test("method registration") test_methods(socket.tcp(), { "accept", @@ -629,12 +651,18 @@ test_methods(socket.udp(), { "settimeout" }) +test("partial receive") +test_partialrecv() + test("select function") test_selectbugs() -test("testing read after close") +test("read after close") test_readafterclose() +test("write after close") +test_writeafterclose() + test("connect function") connect_timeout() empty_connect() diff --git a/test/testsupport.lua b/test/testsupport.lua index acad8f5..b986088 100644 --- a/test/testsupport.lua +++ b/test/testsupport.lua @@ -1,13 +1,13 @@ function readfile(name) - local f = io.open(name, "rb") - if not f then return nil end - local s = f:read("*a") - f:close() - return s + local f = io.open(name, "rb") + if not f then return nil end + local s = f:read("*a") + f:close() + return s end function similar(s1, s2) - return string.lower(string.gsub(s1 or "", "%s", "")) == + return string.lower(string.gsub(s1 or "", "%s", "")) == string.lower(string.gsub(s2 or "", "%s", "")) end @@ -28,7 +28,7 @@ local set = rawset local warn = print local setglobal = function(table, key, value) - warn("changed " .. key) + warn("changed " .. key) set(table, key, value) end diff --git a/test/urltest.lua b/test/urltest.lua index 8dc0c14..d46cb03 100644 --- a/test/urltest.lua +++ b/test/urltest.lua @@ -3,439 +3,439 @@ socket.url = require("socket.url") dofile("testsupport.lua") local check_build_url = function(parsed) - local built = socket.url.build(parsed) + local built = socket.url.build(parsed) if built ~= parsed.url then - print("built is different from expected") - print(built) - print(expected) - exit() - end + print("built is different from expected") + print(built) + print(expected) + exit() + end end local check_protect = function(parsed, path, unsafe) - local built = socket.url.build_path(parsed, unsafe) - if built ~= path then - print(built, path) - print("path composition failed.") - exit() - end + local built = socket.url.build_path(parsed, unsafe) + if built ~= path then + print(built, path) + print("path composition failed.") + exit() + end end local check_invert = function(url) - local parsed = socket.url.parse(url) - parsed.path = socket.url.build_path(socket.url.parse_path(parsed.path)) - local rebuilt = socket.url.build(parsed) - if rebuilt ~= url then - print(url, rebuilt) - print("original and rebuilt are different") - exit() - end + local parsed = socket.url.parse(url) + parsed.path = socket.url.build_path(socket.url.parse_path(parsed.path)) + local rebuilt = socket.url.build(parsed) + if rebuilt ~= url then + print(url, rebuilt) + print("original and rebuilt are different") + exit() + end end local check_parse_path = function(path, expect) - local parsed = socket.url.parse_path(path) - for i = 1, math.max(table.getn(parsed), table.getn(expect)) do - if parsed[i] ~= expect[i] then - print(path) + local parsed = socket.url.parse_path(path) + for i = 1, math.max(table.getn(parsed), table.getn(expect)) do + if parsed[i] ~= expect[i] then + print(path) exit() - end - end - if expect.is_directory ~= parsed.is_directory then - print(path) - print("is_directory mismatch") - exit() - end - if expect.is_absolute ~= parsed.is_absolute then - print(path) - print("is_absolute mismatch") - exit() - end - local built = socket.url.build_path(expect) - if built ~= path then - print(built, path) - print("path composition failed.") - exit() - end + end + end + if expect.is_directory ~= parsed.is_directory then + print(path) + print("is_directory mismatch") + exit() + end + if expect.is_absolute ~= parsed.is_absolute then + print(path) + print("is_absolute mismatch") + exit() + end + local built = socket.url.build_path(expect) + if built ~= path then + print(built, path) + print("path composition failed.") + exit() + end end local check_absolute_url = function(base, relative, absolute) - local res = socket.url.absolute(base, relative) - if res ~= absolute then - io.write("absolute: In test for '", relative, "' expected '", + local res = socket.url.absolute(base, relative) + if res ~= absolute then + io.write("absolute: In test for '", relative, "' expected '", absolute, "' but got '", res, "'\n") - exit() - end + exit() + end end local check_parse_url = function(gaba) - local url = gaba.url - gaba.url = nil - local parsed = socket.url.parse(url) - for i, v in pairs(gaba) do - if v ~= parsed[i] then - io.write("parse: In test for '", url, "' expected ", i, " = '", - v, "' but got '", tostring(parsed[i]), "'\n") - for i,v in pairs(parsed) do print(i,v) end - exit() - end - end - for i, v in pairs(parsed) do - if v ~= gaba[i] then - io.write("parse: In test for '", url, "' expected ", i, " = '", - tostring(gaba[i]), "' but got '", v, "'\n") - for i,v in pairs(parsed) do print(i,v) end - exit() - end - end + local url = gaba.url + gaba.url = nil + local parsed = socket.url.parse(url) + for i, v in pairs(gaba) do + if v ~= parsed[i] then + io.write("parse: In test for '", url, "' expected ", i, " = '", + v, "' but got '", tostring(parsed[i]), "'\n") + for i,v in pairs(parsed) do print(i,v) end + exit() + end + end + for i, v in pairs(parsed) do + if v ~= gaba[i] then + io.write("parse: In test for '", url, "' expected ", i, " = '", + tostring(gaba[i]), "' but got '", v, "'\n") + for i,v in pairs(parsed) do print(i,v) end + exit() + end + end end print("testing URL parsing") check_parse_url{ - url = "scheme://userinfo@host:port/path;params?query#fragment", - scheme = "scheme", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + url = "scheme://userinfo@host:port/path;params?query#fragment", + scheme = "scheme", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_parse_url{ - url = "scheme://user:password@host:port/path;params?query#fragment", - scheme = "scheme", - authority = "user:password@host:port", - host = "host", - port = "port", - userinfo = "user:password", - user = "user", - password = "password", - path = "/path", - params = "params", - query = "query", - fragment = "fragment", + url = "scheme://user:password@host:port/path;params?query#fragment", + scheme = "scheme", + authority = "user:password@host:port", + host = "host", + port = "port", + userinfo = "user:password", + user = "user", + password = "password", + path = "/path", + params = "params", + query = "query", + fragment = "fragment", } check_parse_url{ - url = "scheme://userinfo@host:port/path;params?query#", - scheme = "scheme", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/path", - params = "params", - query = "query", - fragment = "" + url = "scheme://userinfo@host:port/path;params?query#", + scheme = "scheme", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/path", + params = "params", + query = "query", + fragment = "" } check_parse_url{ - url = "scheme://userinfo@host:port/path;params?#fragment", - scheme = "scheme", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/path", - params = "params", - query = "", - fragment = "fragment" + url = "scheme://userinfo@host:port/path;params?#fragment", + scheme = "scheme", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/path", + params = "params", + query = "", + fragment = "fragment" } check_parse_url{ - url = "scheme://userinfo@host:port/path;params#fragment", - scheme = "scheme", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/path", - params = "params", - fragment = "fragment" + url = "scheme://userinfo@host:port/path;params#fragment", + scheme = "scheme", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/path", + params = "params", + fragment = "fragment" } check_parse_url{ - url = "scheme://userinfo@host:port/path;?query#fragment", - scheme = "scheme", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/path", - params = "", - query = "query", - fragment = "fragment" + url = "scheme://userinfo@host:port/path;?query#fragment", + scheme = "scheme", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/path", + params = "", + query = "query", + fragment = "fragment" } check_parse_url{ - url = "scheme://userinfo@host:port/path?query#fragment", - scheme = "scheme", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/path", - query = "query", - fragment = "fragment" + url = "scheme://userinfo@host:port/path?query#fragment", + scheme = "scheme", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/path", + query = "query", + fragment = "fragment" } check_parse_url{ - url = "scheme://userinfo@host:port/;params?query#fragment", - scheme = "scheme", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/", - params = "params", - query = "query", - fragment = "fragment" + url = "scheme://userinfo@host:port/;params?query#fragment", + scheme = "scheme", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/", + params = "params", + query = "query", + fragment = "fragment" } check_parse_url{ - url = "scheme://userinfo@host:port", - scheme = "scheme", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", + url = "scheme://userinfo@host:port", + scheme = "scheme", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", } check_parse_url{ - url = "//userinfo@host:port/path;params?query#fragment", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + url = "//userinfo@host:port/path;params?query#fragment", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_parse_url{ - url = "//userinfo@host:port/path", - authority = "userinfo@host:port", - host = "host", - port = "port", - userinfo = "userinfo", - user = "userinfo", - path = "/path", + url = "//userinfo@host:port/path", + authority = "userinfo@host:port", + host = "host", + port = "port", + userinfo = "userinfo", + user = "userinfo", + path = "/path", } check_parse_url{ - url = "//userinfo@host/path", - authority = "userinfo@host", - host = "host", - userinfo = "userinfo", - user = "userinfo", - path = "/path", + url = "//userinfo@host/path", + authority = "userinfo@host", + host = "host", + userinfo = "userinfo", + user = "userinfo", + path = "/path", } check_parse_url{ - url = "//user:password@host/path", - authority = "user:password@host", - host = "host", - userinfo = "user:password", - password = "password", - user = "user", - path = "/path", + url = "//user:password@host/path", + authority = "user:password@host", + host = "host", + userinfo = "user:password", + password = "password", + user = "user", + path = "/path", } check_parse_url{ - url = "//user:@host/path", - authority = "user:@host", - host = "host", - userinfo = "user:", - password = "", - user = "user", - path = "/path", + url = "//user:@host/path", + authority = "user:@host", + host = "host", + userinfo = "user:", + password = "", + user = "user", + path = "/path", } check_parse_url{ - url = "//user@host:port/path", - authority = "user@host:port", - host = "host", - userinfo = "user", - user = "user", - port = "port", - path = "/path", + url = "//user@host:port/path", + authority = "user@host:port", + host = "host", + userinfo = "user", + user = "user", + port = "port", + path = "/path", } check_parse_url{ - url = "//host:port/path", - authority = "host:port", - port = "port", - host = "host", - path = "/path", + url = "//host:port/path", + authority = "host:port", + port = "port", + host = "host", + path = "/path", } check_parse_url{ - url = "//host/path", - authority = "host", - host = "host", - path = "/path", + url = "//host/path", + authority = "host", + host = "host", + path = "/path", } check_parse_url{ - url = "//host", - authority = "host", - host = "host", + url = "//host", + authority = "host", + host = "host", } check_parse_url{ - url = "/path", - path = "/path", + url = "/path", + path = "/path", } check_parse_url{ - url = "path", - path = "path", + url = "path", + path = "path", } print("testing URL building") check_build_url { - url = "scheme://user:password@host:port/path;params?query#fragment", - scheme = "scheme", - host = "host", - port = "port", - user = "user", - password = "password", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + url = "scheme://user:password@host:port/path;params?query#fragment", + scheme = "scheme", + host = "host", + port = "port", + user = "user", + password = "password", + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_build_url { - url = "scheme://user:password@host/path;params?query#fragment", - scheme = "scheme", - host = "host", - user = "user", - password = "password", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + url = "scheme://user:password@host/path;params?query#fragment", + scheme = "scheme", + host = "host", + user = "user", + password = "password", + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_build_url { - url = "scheme://user@host/path;params?query#fragment", - scheme = "scheme", - host = "host", - user = "user", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + url = "scheme://user@host/path;params?query#fragment", + scheme = "scheme", + host = "host", + user = "user", + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_build_url { - url = "scheme://host/path;params?query#fragment", - scheme = "scheme", - host = "host", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + url = "scheme://host/path;params?query#fragment", + scheme = "scheme", + host = "host", + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_build_url { - url = "scheme://host/path;params#fragment", - scheme = "scheme", - host = "host", - path = "/path", - params = "params", - fragment = "fragment" + url = "scheme://host/path;params#fragment", + scheme = "scheme", + host = "host", + path = "/path", + params = "params", + fragment = "fragment" } check_build_url { - url = "scheme://host/path#fragment", - scheme = "scheme", - host = "host", - path = "/path", - fragment = "fragment" + url = "scheme://host/path#fragment", + scheme = "scheme", + host = "host", + path = "/path", + fragment = "fragment" } check_build_url { - url = "scheme://host/path", - scheme = "scheme", - host = "host", - path = "/path", + url = "scheme://host/path", + scheme = "scheme", + host = "host", + path = "/path", } check_build_url { - url = "//host/path", - host = "host", - path = "/path", + url = "//host/path", + host = "host", + path = "/path", } check_build_url { - url = "/path", - path = "/path", + url = "/path", + path = "/path", } check_build_url { - url = "scheme://user:password@host:port/path;params?query#fragment", - scheme = "scheme", - host = "host", - port = "port", - user = "user", + url = "scheme://user:password@host:port/path;params?query#fragment", + scheme = "scheme", + host = "host", + port = "port", + user = "user", userinfo = "not used", - password = "password", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + password = "password", + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_build_url { - url = "scheme://user:password@host:port/path;params?query#fragment", - scheme = "scheme", - host = "host", - port = "port", - user = "user", + url = "scheme://user:password@host:port/path;params?query#fragment", + scheme = "scheme", + host = "host", + port = "port", + user = "user", userinfo = "not used", authority = "not used", - password = "password", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + password = "password", + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_build_url { - url = "scheme://user:password@host:port/path;params?query#fragment", - scheme = "scheme", - host = "host", - port = "port", + url = "scheme://user:password@host:port/path;params?query#fragment", + scheme = "scheme", + host = "host", + port = "port", userinfo = "user:password", authority = "not used", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } check_build_url { - url = "scheme://user:password@host:port/path;params?query#fragment", - scheme = "scheme", + url = "scheme://user:password@host:port/path;params?query#fragment", + scheme = "scheme", authority = "user:password@host:port", - path = "/path", - params = "params", - query = "query", - fragment = "fragment" + path = "/path", + params = "params", + query = "query", + fragment = "fragment" } -- standard RFC tests @@ -488,11 +488,11 @@ print("testing path parsing and composition") check_parse_path("/eu/tu/ele", { "eu", "tu", "ele"; is_absolute = 1 }) check_parse_path("/eu/", { "eu"; is_absolute = 1, is_directory = 1 }) check_parse_path("eu/tu/ele/nos/vos/eles/", - { "eu", "tu", "ele", "nos", "vos", "eles"; is_directory = 1}) + { "eu", "tu", "ele", "nos", "vos", "eles"; is_directory = 1}) check_parse_path("/", { is_absolute = 1, is_directory = 1}) check_parse_path("", { }) check_parse_path("eu%01/%02tu/e%03l%04e/nos/vos%05/e%12les/", - { "eu\1", "\2tu", "e\3l\4e", "nos", "vos\5", "e\18les"; is_directory = 1}) + { "eu\1", "\2tu", "e\3l\4e", "nos", "vos\5", "e\18les"; is_directory = 1}) check_parse_path("eu/tu", { "eu", "tu" }) print("testing path protection") diff --git a/test/utestclnt.lua b/test/utestclnt.lua index f002c6e..eec6adc 100644 --- a/test/utestclnt.lua +++ b/test/utestclnt.lua @@ -298,7 +298,7 @@ function empty_connect() pass("ok") data = socket.connect(host, port) else - pass("gethostbyname returns localhost on empty string...") + pass("gethostbyname returns localhost on empty string...") end end