mirror of
https://github.com/bunkerity/bunkerweb
synced 2026-05-24 09:28:37 +00:00
Remove unused test files for luasocket
This commit is contained in:
parent
a4e550bf16
commit
ddd8a7d4ef
60 changed files with 0 additions and 15404 deletions
183
src/deps/src/luasocket/docs/dns.html
vendored
183
src/deps/src/luasocket/docs/dns.html
vendored
|
|
@ -1,183 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: DNS support">
|
||||
<meta name="keywords" content="Lua, LuaSocket, DNS, Network, Library, Support">
|
||||
<title>LuaSocket: DNS support</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- dns ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="dns">DNS</h2>
|
||||
|
||||
<p>
|
||||
IPv4 name resolution functions
|
||||
<a href="#toip"><tt>dns.toip</tt></a>
|
||||
and
|
||||
<a href="#tohostname"><tt>dns.tohostname</tt></a>
|
||||
return <em>all</em> information obtained from
|
||||
the resolver in a table of the form:
|
||||
</p>
|
||||
|
||||
<blockquote><tt>
|
||||
resolved4 = {<br>
|
||||
name = <i>canonic-name</i>,<br>
|
||||
alias = <i>alias-list</i>,<br>
|
||||
ip = <i>ip-address-list</i><br>
|
||||
}
|
||||
</tt> </blockquote>
|
||||
|
||||
<p>
|
||||
Note that the <tt>alias</tt> list can be empty.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The more general name resolution function
|
||||
<a href="#getaddrinfo"><tt>dns.getaddrinfo</tt></a>, which
|
||||
supports both IPv6 and IPv4,
|
||||
returns <em>all</em> information obtained from
|
||||
the resolver in a table of the form:
|
||||
</p>
|
||||
|
||||
<blockquote><tt>
|
||||
resolved6 = {<br>
|
||||
[1] = {<br>
|
||||
family = <i>family-name-1</i>,<br>
|
||||
addr = <i>address-1</i><br>
|
||||
},<br>
|
||||
...<br>
|
||||
[n] = {<br>
|
||||
family = <i>family-name-n</i>,<br>
|
||||
addr = <i>address-n</i><br>
|
||||
}<br>
|
||||
}
|
||||
</tt> </blockquote>
|
||||
|
||||
<p>
|
||||
Here, <tt>family</tt> contains the string <tt>"inet"</tt> for IPv4
|
||||
addresses, and <tt>"inet6"</tt> for IPv6 addresses.
|
||||
</p>
|
||||
|
||||
<!-- getaddrinfo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getaddrinfo">
|
||||
socket.dns.<b>getaddrinfo(</b>address<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Converts from host name to address.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Address</tt> can be an IPv4 or IPv6 address or host name.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns a table with all information returned by
|
||||
the resolver. In case of error, the function returns <b><tt>nil</tt></b>
|
||||
followed by an error message.
|
||||
</p>
|
||||
|
||||
<!-- gethostname ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="gethostname">
|
||||
socket.dns.<b>gethostname()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns the standard host name for the machine as a string.
|
||||
</p>
|
||||
|
||||
<!-- tohostname +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="tohostname">
|
||||
socket.dns.<b>tohostname(</b>address<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Converts from IPv4 address to host name.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Address</tt> can be an IP address or host name.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns a string with the canonic host name of the given
|
||||
<tt>address</tt>, followed by a table with all information returned by
|
||||
the resolver. In case of error, the function returns <b><tt>nil</tt></b>
|
||||
followed by an error message.
|
||||
</p>
|
||||
|
||||
<!-- toip +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="toip">
|
||||
socket.dns.<b>toip(</b>address<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Converts from host name to IPv4 address.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Address</tt> can be an IP address or host name.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
Returns a string with the first IP address found for <tt>address</tt>,
|
||||
followed by a table with all information returned by the resolver.
|
||||
In case of error, the function returns <b><tt>nil</tt></b> followed by an error
|
||||
message.
|
||||
</p>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:25:07 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
288
src/deps/src/luasocket/docs/ftp.html
vendored
288
src/deps/src/luasocket/docs/ftp.html
vendored
|
|
@ -1,288 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: FTP support">
|
||||
<meta name="keywords" content="Lua, LuaSocket, FTP, Network, Library, Support">
|
||||
<title>LuaSocket: FTP support</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- ftp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="ftp">FTP</h2>
|
||||
|
||||
<p>
|
||||
FTP (File Transfer Protocol) is a protocol used to transfer files
|
||||
between hosts. The <tt>ftp</tt> namespace offers thorough support
|
||||
to FTP, under a simple interface. The implementation conforms to
|
||||
<a href="http://www.ietf.org/rfc/rfc959.txt">RFC 959</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
High level functions are provided supporting the most common operations.
|
||||
These high level functions are implemented on top of a lower level
|
||||
interface. Using the low-level interface, users can easily create their
|
||||
own functions to access <em>any</em> operation supported by the FTP
|
||||
protocol. For that, check the implementation.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To really benefit from this module, a good understanding of
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">
|
||||
LTN012, Filters sources and sinks</a> is necessary.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To obtain the <tt>ftp</tt> namespace, run:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- loads the FTP module and any libraries it requires
|
||||
local ftp = require("socket.ftp")
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
URLs MUST conform to
|
||||
<a href="http://www.ietf.org/rfc/rfc1738.txt">RFC 1738</a>,
|
||||
that is, an URL is a string in the form:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<tt>
|
||||
[ftp://][<user>[:<password>]@]<host>[:<port>][/<path>][<i>type</i>=a|i]</tt>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
The following constants in the namespace can be set to control the default behavior of
|
||||
the FTP module:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li> <tt>PASSWORD</tt>: default anonymous password.</li>
|
||||
<li> <tt>TIMEOUT</tt>: sets the timeout for all I/O operations;</li>
|
||||
<li> <tt>USER</tt>: default anonymous user;</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<!-- ftp.get ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="get">
|
||||
ftp.<b>get(</b>url<b>)</b><br>
|
||||
ftp.<b>get{</b><br>
|
||||
host = <i>string</i>,<br>
|
||||
sink = <i>LTN12 sink</i>,<br>
|
||||
argument <i>or</i> path = <i>string</i>,<br>
|
||||
[user = <i>string</i>,]<br>
|
||||
[password = <i>string</i>]<br>
|
||||
[command = <i>string</i>,]<br>
|
||||
[port = <i>number</i>,]<br>
|
||||
[type = <i>string</i>,]<br>
|
||||
[step = <i>LTN12 pump step</i>,]<br>
|
||||
[create = <i>function</i>]<br>
|
||||
<b>}</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
The <tt>get</tt> function has two forms. The simple form has fixed
|
||||
functionality: it downloads the contents of a URL and returns it as a
|
||||
string. The generic form allows a <em>lot</em> more control, as explained
|
||||
below.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
If the argument of the <tt>get</tt> function is a table, the function
|
||||
expects at least the fields <tt>host</tt>, <tt>sink</tt>, and one of
|
||||
<tt>argument</tt> or <tt>path</tt> (<tt>argument</tt> takes
|
||||
precedence). <tt>Host</tt> is the server to connect to. <tt>Sink</tt> is
|
||||
the <em>simple</em>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
sink that will receive the downloaded data. <tt>Argument</tt> or
|
||||
<tt>path</tt> give the target path to the resource in the server. The
|
||||
optional arguments are the following:
|
||||
</p>
|
||||
<ul>
|
||||
<li><tt>user</tt>, <tt>password</tt>: User name and password used for
|
||||
authentication. Defaults to "<tt>ftp:anonymous@anonymous.org</tt>";</li>
|
||||
<li><tt>command</tt>: The FTP command used to obtain data. Defaults to
|
||||
"<tt>retr</tt>", but see example below;</li>
|
||||
<li><tt>port</tt>: The port to used for the control connection. Defaults to 21;</li>
|
||||
<li><tt>type</tt>: The transfer mode. Can take values "<tt>i</tt>" or
|
||||
"<tt>a</tt>". Defaults to whatever is the server default;</li>
|
||||
<li><tt>step</tt>:
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
pump step function used to pass data from the
|
||||
server to the sink. Defaults to the LTN12 <tt>pump.step</tt> function;</li>
|
||||
<li><tt>create</tt>: An optional function to be used instead of
|
||||
<a href="tcp.html#socket.tcp"><tt>socket.tcp</tt></a> when the communications socket is created.</li>
|
||||
</ul>
|
||||
|
||||
<p class="return">
|
||||
If successful, the simple version returns the URL contents as a
|
||||
string, and the generic function returns 1. In case of error, both
|
||||
functions return <b><tt>nil</tt></b> and an error message describing the
|
||||
error.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the ftp support
|
||||
local ftp = require("socket.ftp")
|
||||
|
||||
-- Log as user "anonymous" on server "ftp.tecgraf.puc-rio.br",
|
||||
-- and get file "lua.tar.gz" from directory "pub/lua" as binary.
|
||||
f, e = ftp.get("ftp://ftp.tecgraf.puc-rio.br/pub/lua/lua.tar.gz;type=i")
|
||||
</pre>
|
||||
|
||||
<pre class="example">
|
||||
-- load needed modules
|
||||
local ftp = require("socket.ftp")
|
||||
local ltn12 = require("ltn12")
|
||||
local url = require("socket.url")
|
||||
|
||||
-- a function that returns a directory listing
|
||||
function nlst(u)
|
||||
local t = {}
|
||||
local p = url.parse(u)
|
||||
p.command = "nlst"
|
||||
p.sink = ltn12.sink.table(t)
|
||||
local r, e = ftp.get(p)
|
||||
return r and table.concat(t), e
|
||||
end
|
||||
</pre>
|
||||
|
||||
<!-- put ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="put">
|
||||
ftp.<b>put(</b>url, content<b>)</b><br>
|
||||
ftp.<b>put{</b><br>
|
||||
host = <i>string</i>,<br>
|
||||
source = <i>LTN12 sink</i>,<br>
|
||||
argument <i>or</i> path = <i>string</i>,<br>
|
||||
[user = <i>string</i>,]<br>
|
||||
[password = <i>string</i>]<br>
|
||||
[command = <i>string</i>,]<br>
|
||||
[port = <i>number</i>,]<br>
|
||||
[type = <i>string</i>,]<br>
|
||||
[step = <i>LTN12 pump step</i>,]<br>
|
||||
[create = <i>function</i>]<br>
|
||||
<b>}</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
The <tt>put</tt> function has two forms. The simple form has fixed
|
||||
functionality: it uploads a string of content into a URL. The generic form
|
||||
allows a <em>lot</em> more control, as explained below.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
If the argument of the <tt>put</tt> function is a table, the function
|
||||
expects at least the fields <tt>host</tt>, <tt>source</tt>, and one of
|
||||
<tt>argument</tt> or <tt>path</tt> (<tt>argument</tt> takes
|
||||
precedence). <tt>Host</tt> is the server to connect to. <tt>Source</tt> is
|
||||
the <em>simple</em>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
source that will provide the contents to be uploaded.
|
||||
<tt>Argument</tt> or
|
||||
<tt>path</tt> give the target path to the resource in the server. The
|
||||
optional arguments are the following:
|
||||
</p>
|
||||
<ul>
|
||||
<li><tt>user</tt>, <tt>password</tt>: User name and password used for
|
||||
authentication. Defaults to "<tt>ftp:anonymous@anonymous.org</tt>";</li>
|
||||
<li><tt>command</tt>: The FTP command used to send data. Defaults to
|
||||
"<tt>stor</tt>", but see example below;</li>
|
||||
<li><tt>port</tt>: The port to used for the control connection. Defaults to 21;</li>
|
||||
<li><tt>type</tt>: The transfer mode. Can take values "<tt>i</tt>" or
|
||||
"<tt>a</tt>". Defaults to whatever is the server default;</li>
|
||||
<li><tt>step</tt>:
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
pump step function used to pass data from the
|
||||
server to the sink. Defaults to the LTN12 <tt>pump.step</tt> function;</li>
|
||||
<li><tt>create</tt>: An optional function to be used instead of
|
||||
<a href="tcp.html#socket.tcp"><tt>socket.tcp</tt></a> when the communications socket is created.</li>
|
||||
</ul>
|
||||
|
||||
<p class="return">
|
||||
Both functions return 1 if successful, or <b><tt>nil</tt></b> and an error
|
||||
message describing the reason for failure.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the ftp support
|
||||
local ftp = require("socket.ftp")
|
||||
|
||||
-- Log as user "fulano" on server "ftp.example.com",
|
||||
-- using password "silva", and store a file "README" with contents
|
||||
-- "wrong password, of course"
|
||||
f, e = ftp.put("ftp://fulano:silva@ftp.example.com/README",
|
||||
"wrong password, of course")
|
||||
</pre>
|
||||
|
||||
<pre class="example">
|
||||
-- load the ftp support
|
||||
local ftp = require("socket.ftp")
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- Log as user "fulano" on server "ftp.example.com",
|
||||
-- using password "silva", and append to the remote file "LOG", sending the
|
||||
-- contents of the local file "LOCAL-LOG"
|
||||
f, e = ftp.put{
|
||||
host = "ftp.example.com",
|
||||
user = "fulano",
|
||||
password = "silva",
|
||||
command = "appe",
|
||||
argument = "LOG",
|
||||
source = ltn12.source.file(io.open("LOCAL-LOG", "r"))
|
||||
}
|
||||
</pre>
|
||||
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:25:18 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
339
src/deps/src/luasocket/docs/http.html
vendored
339
src/deps/src/luasocket/docs/http.html
vendored
|
|
@ -1,339 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: HTTP support">
|
||||
<meta name="keywords" content="Lua, HTTP, Library, WWW, Browser, Network, Support">
|
||||
<title>LuaSocket: HTTP support</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- http +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="http">HTTP</h2>
|
||||
|
||||
<p>
|
||||
HTTP (Hyper Text Transfer Protocol) is the protocol used to exchange
|
||||
information between web-browsers and servers. The <tt>http</tt>
|
||||
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,
|
||||
<a href="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The module exports functions that provide HTTP functionality in different
|
||||
levels of abstraction. From the simple
|
||||
string oriented requests, through generic
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> based, down to even lower-level if you bother to look through the source code.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To obtain the <tt>http</tt> namespace, run:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- loads the HTTP module and any libraries it requires
|
||||
local http = require("socket.http")
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
URLs must conform to
|
||||
<a href="http://www.ietf.org/rfc/rfc1738.txt">RFC 1738</a>,
|
||||
that is, an URL is a string in the form:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
[http://][<user>[:<password>]@]<host>[:<port>][/<path>]
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
MIME headers are represented as a Lua table in the form:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<table summary="MIME headers in Lua table">
|
||||
<tr><td><tt>
|
||||
headers = {<br>
|
||||
field-1-name = <i>field-1-value</i>,<br>
|
||||
field-2-name = <i>field-2-value</i>,<br>
|
||||
field-3-name = <i>field-3-value</i>,<br>
|
||||
...<br>
|
||||
field-n-name = <i>field-n-value</i><br>
|
||||
}
|
||||
</tt></td></tr>
|
||||
</table>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
Field names are case insensitive (as specified by the standard) and all
|
||||
functions work with lowercase field names (but see
|
||||
<a href="socket.html#headers.canonic"><tt>socket.headers.canonic</tt></a>).
|
||||
Field values are left unmodified.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: MIME headers are independent of order. Therefore, there is no problem
|
||||
in representing them in a Lua table.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The following constants can be set to control the default behavior of
|
||||
the HTTP module:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li> <tt>PROXY</tt>: default proxy used for connections;</li>
|
||||
<li> <tt>TIMEOUT</tt>: sets the timeout for all I/O operations;</li>
|
||||
<li> <tt>USERAGENT</tt>: default user agent reported to server.</li>
|
||||
</ul>
|
||||
|
||||
<p class="note">
|
||||
Note: These constants are global. Changing them will also
|
||||
change the behavior other code that might be using LuaSocket.
|
||||
</p>
|
||||
|
||||
<!-- http.request ++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="request">
|
||||
http.<b>request(</b>url [, body]<b>)</b><br>
|
||||
http.<b>request{</b><br>
|
||||
url = <i>string</i>,<br>
|
||||
[sink = <i>LTN12 sink</i>,]<br>
|
||||
[method = <i>string</i>,]<br>
|
||||
[headers = <i>header-table</i>,]<br>
|
||||
[source = <i>LTN12 source</i>],<br>
|
||||
[step = <i>LTN12 pump step</i>,]<br>
|
||||
[proxy = <i>string</i>,]<br>
|
||||
[redirect = <i>boolean</i>,]<br>
|
||||
[create = <i>function</i>,]<br>
|
||||
[maxredirects = <i>number</i>]<br>
|
||||
<b>}</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
The request function has two forms. The simple form downloads
|
||||
a URL using the <tt>GET</tt> or <tt>POST</tt> method and is based
|
||||
on strings. The generic form performs any HTTP method and is
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> based.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
If the first argument of the <tt>request</tt> function is a string, it
|
||||
should be an <tt>url</tt>. In that case, if a <tt>body</tt>
|
||||
is provided as a string, the function will perform a <tt>POST</tt> method
|
||||
in the <tt>url</tt>. Otherwise, it performs a <tt>GET</tt> in the
|
||||
<tt>url</tt>
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
If the first argument is instead a table, the most important fields are
|
||||
the <tt>url</tt> and the <em>simple</em>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
<tt>sink</tt> that will receive the downloaded content.
|
||||
Any part of the <tt>url</tt> can be overridden by including
|
||||
the appropriate field in the request table.
|
||||
If authentication information is provided, the function
|
||||
uses the Basic Authentication Scheme (see <a href="#authentication">note</a>)
|
||||
to retrieve the document. If <tt>sink</tt> is <tt><b>nil</b></tt>, the
|
||||
function discards the downloaded data. The optional parameters are the
|
||||
following:
|
||||
</p>
|
||||
<ul>
|
||||
<li><tt>method</tt>: The HTTP request method. Defaults to "GET";</li>
|
||||
<li><tt>headers</tt>: Any additional HTTP headers to send with the request;</li>
|
||||
<li><tt>source</tt>: <em>simple</em>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
source to provide the request body. If there
|
||||
is a body, you need to provide an appropriate "<tt>content-length</tt>"
|
||||
request header field, or the function will attempt to send the body as
|
||||
"<tt>chunked</tt>" (something few servers support). Defaults to the empty source;</li>
|
||||
<li><tt>step</tt>:
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
pump step function used to move data.
|
||||
Defaults to the LTN12 <tt>pump.step</tt> function.</li>
|
||||
<li><tt>proxy</tt>: The URL of a proxy server to use. Defaults to no proxy;</li>
|
||||
<li><tt>redirect</tt>: Set to <tt><b>false</b></tt> to prevent the
|
||||
function from automatically following 301 or 302 server redirect messages;</li>
|
||||
<li><tt>create</tt>: An optional function to be used instead of
|
||||
<a href="tcp.html#socket.tcp"><tt>socket.tcp</tt></a> when the communications socket is created.</li>
|
||||
<li><tt>maxredirects</tt>: An optional number specifying the maximum number of
|
||||
redirects to follow. Defaults to <tt>5</tt> if not specified. A boolean
|
||||
<tt>false</tt> value means no maximum (unlimited).</li>
|
||||
</ul>
|
||||
|
||||
<p class="return">
|
||||
In case of failure, the function returns <tt><b>nil</b></tt> followed by an
|
||||
error message. If successful, the simple form returns the response
|
||||
body as a string, followed by the response status code, the response
|
||||
headers and the response status line. The generic function returns the same
|
||||
information, except the first return value is just the number 1 (the body
|
||||
goes to the <tt>sink</tt>).
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
Even when the server fails to provide the contents of the requested URL (URL not found, for example),
|
||||
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 <tt>code</tt>. For
|
||||
a list of the possible values and their meanings, refer to <a
|
||||
href="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616</a>.
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Here are a few examples with the simple interface:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the http module
|
||||
local io = require("io")
|
||||
local http = require("socket.http")
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- connect to server "www.cs.princeton.edu" and retrieves this manual
|
||||
-- file from "~diego/professional/luasocket/http.html" and print it to stdout
|
||||
http.request{
|
||||
url = "http://www.cs.princeton.edu/~diego/professional/luasocket/http.html",
|
||||
sink = ltn12.sink.file(io.stdout)
|
||||
}
|
||||
|
||||
-- connect to server "www.example.com" and tries to retrieve
|
||||
-- "/private/index.html". Fails because authentication is needed.
|
||||
b, c, h = http.request("http://www.example.com/private/index.html")
|
||||
-- b returns some useless page telling about the denied access,
|
||||
-- h returns authentication information
|
||||
-- and c returns with value 401 (Authentication Required)
|
||||
|
||||
-- tries to connect to server "wrong.host" to retrieve "/"
|
||||
-- and fails because the host does not exist.
|
||||
r, e = http.request("http://wrong.host/")
|
||||
-- r is nil, and e returns with value "host not found"
|
||||
</pre>
|
||||
|
||||
<p class="description">
|
||||
And here is an example using the generic interface:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the http module
|
||||
http = require("socket.http")
|
||||
|
||||
-- Requests information about a document, without downloading it.
|
||||
-- Useful, for example, if you want to display a download gauge and need
|
||||
-- to know the size of the document in advance
|
||||
r, c, h = http.request {
|
||||
method = "HEAD",
|
||||
url = "http://www.tecgraf.puc-rio.br/~diego"
|
||||
}
|
||||
-- r is 1, c is 200, and h would return the following headers:
|
||||
-- h = {
|
||||
-- date = "Tue, 18 Sep 2001 20:42:21 GMT",
|
||||
-- server = "Apache/1.3.12 (Unix) (Red Hat/Linux)",
|
||||
-- ["last-modified"] = "Wed, 05 Sep 2001 06:11:20 GMT",
|
||||
-- ["content-length"] = 15652,
|
||||
-- ["connection"] = "close",
|
||||
-- ["content-Type"] = "text/html"
|
||||
-- }
|
||||
</pre>
|
||||
|
||||
<p class="note" id="post">
|
||||
Note: When sending a POST request, simple interface adds a
|
||||
"<tt>Content-type: application/x-www-form-urlencoded</tt>"
|
||||
header to the request. This is the type used by
|
||||
HTML forms. If you need another type, use the generic
|
||||
interface.
|
||||
</p>
|
||||
|
||||
<p class="note" id="authentication">
|
||||
Note: Some URLs are protected by their
|
||||
servers from anonymous download. For those URLs, the server must receive
|
||||
some sort of authentication along with the request or it will deny
|
||||
download and return status "401 Authentication Required".
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
The HTTP/1.1 standard defines two authentication methods: the Basic
|
||||
Authentication Scheme and the Digest Authentication Scheme, both
|
||||
explained in detail in
|
||||
<a href="http://www.ietf.org/rfc/rfc2068.txt">RFC 2068</a>.
|
||||
</p>
|
||||
|
||||
<p class="note">The Basic Authentication Scheme sends
|
||||
<tt><user></tt> and
|
||||
<tt><password></tt> unencrypted to the server and is therefore
|
||||
considered unsafe. Unfortunately, by the time of this implementation,
|
||||
the wide majority of servers and browsers support the Basic Scheme only.
|
||||
Therefore, this is the method used by the toolkit whenever
|
||||
authentication is required.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load required modules
|
||||
http = require("socket.http")
|
||||
mime = require("mime")
|
||||
|
||||
-- Connect to server "www.example.com" and tries to retrieve
|
||||
-- "/private/index.html", using the provided name and password to
|
||||
-- authenticate the request
|
||||
b, c, h = http.request("http://fulano:silva@www.example.com/private/index.html")
|
||||
|
||||
-- Alternatively, one could fill the appropriate header and authenticate
|
||||
-- the request directly.
|
||||
r, c = http.request {
|
||||
url = "http://www.example.com/private/index.html",
|
||||
headers = { authorization = "Basic " .. (mime.b64("fulano:silva")) }
|
||||
}
|
||||
</pre>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Eric Westbrook on <br>
|
||||
Sat Feb 23 19:09:42 UTC 2019
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
138
src/deps/src/luasocket/docs/index.html
vendored
138
src/deps/src/luasocket/docs/index.html
vendored
|
|
@ -1,138 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="The LuaSocket Homepage">
|
||||
<meta name="keywords" content="Lua, LuaSocket, Network, Library, Support, Internet">
|
||||
<title>LuaSocket: Network support for the Lua language </title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- whatis +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="whatis">What is LuaSocket?</h2>
|
||||
|
||||
<p>
|
||||
LuaSocket is a <a href="http://www.lua.org">Lua</a> extension library
|
||||
that is composed by two parts: a C core that provides support for the TCP
|
||||
and UDP transport layers, and a set of Lua modules that add support for
|
||||
functionality commonly needed by applications that deal with the Internet.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The core support has been implemented so that it is both efficient and
|
||||
simple to use. It is available to any Lua application once it has been
|
||||
properly initialized by the interpreter in use. The code has been tested
|
||||
and runs well on several Windows and UNIX platforms. </p>
|
||||
|
||||
<p>
|
||||
Among the support modules, the most commonly used implement the
|
||||
<a href="smtp.html">SMTP</a>
|
||||
(sending e-mails),
|
||||
<a href="http.html">HTTP</a>
|
||||
(WWW access) and
|
||||
<a href="ftp.html">FTP</a>
|
||||
(uploading and downloading files) client
|
||||
protocols. These provide a very natural and generic interface to the
|
||||
functionality defined by each protocol.
|
||||
In addition, you will find that the
|
||||
<a href="mime.html">MIME</a> (common encodings),
|
||||
<a href="url.html">URL</a>
|
||||
(anything you could possible want to do with one) and
|
||||
<a href="ltn12.html">LTN12</a>
|
||||
(filters, sinks, sources and pumps) modules can be very handy.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The library is available under the same
|
||||
<a href="http://www.lua.org/copyright.html">
|
||||
terms and conditions</a> as the Lua language, the MIT license. The idea is
|
||||
that if you can use Lua in a project, you should also be able to use
|
||||
LuaSocket.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Copyright © 1999-2013 Diego Nehab. All rights reserved. <br>
|
||||
Author: <a href="http://www.impa.br/~diego">Diego Nehab</a>
|
||||
</p>
|
||||
|
||||
<!-- download +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="download">Download</h2>
|
||||
|
||||
<p>
|
||||
LuaSocket version 3.1.0 is now available for download!
|
||||
It is compatible with Lua 5.1 through 5.4.
|
||||
Chances are it works well on most UNIX distributions and Windows flavors.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The current version of the library can be found at
|
||||
the <a href="https://github.com/lunarmodules/luasocket">LuaSocket
|
||||
project page</a> on GitHub. Besides the full C and Lua source code
|
||||
for the library, the distribution contains several examples,
|
||||
this user's manual and basic test procedures.
|
||||
</p>
|
||||
|
||||
<p> Take a look at the <a
|
||||
href="installation.html">installation</a> section of the
|
||||
manual to find out how to properly install the library.
|
||||
</p>
|
||||
|
||||
<!-- thanks +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="thanks">Special thanks</h2>
|
||||
|
||||
<p>
|
||||
This marks the first release of LuaSocket that
|
||||
wholeheartedly embraces the open-source development
|
||||
philosophy. After a long hiatus, Matthew Wild finally
|
||||
convinced me it was time for a release including IPv6 and
|
||||
Lua 5.2 support. It was more work than we anticipated.
|
||||
Special thanks to Sam Roberts, Florian Zeitz, and Paul
|
||||
Aurich, Liam Devine, Alexey Melnichuk, and everybody else
|
||||
that has helped bring this library back to life.
|
||||
</p>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
127
src/deps/src/luasocket/docs/installation.html
vendored
127
src/deps/src/luasocket/docs/installation.html
vendored
|
|
@ -1,127 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: Introduction to the core">
|
||||
<meta name="keywords" content="Lua, LuaSocket, TCP, UDP, Network, Support,
|
||||
Installation">
|
||||
<title>LuaSocket: Installation</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class=header>
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align=center><a href="http://www.lua.org">
|
||||
<img width=128 height=128 border=0 alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align=center valign=top>Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class=bar>
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- installation ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2>Installation</h2>
|
||||
|
||||
<p> Here we describe the standard distribution. If the
|
||||
standard doesn't meet your needs, we refer you to the Lua
|
||||
discussion list, where any question about the package scheme
|
||||
will likely already have been answered. </p>
|
||||
|
||||
<h3>Directory structure</h3>
|
||||
|
||||
<p> On Unix systems, the standard distribution uses two base
|
||||
directories, one for system dependent files, and another for system
|
||||
independent files. Let's call these directories <tt><CDIR></tt>
|
||||
and <tt><LDIR></tt>, respectively.
|
||||
For example, in my laptp, Lua 5.1 is configured to
|
||||
use '<tt>/usr/local/lib/lua/5.1</tt>' for
|
||||
<tt><CDIR></tt> and '<tt>/usr/local/share/lua/5.1</tt>' for
|
||||
<tt><LDIR></tt>. On Windows, <tt><CDIR></tt>
|
||||
usually points to the directory where the Lua executable is
|
||||
found, and <tt><LDIR></tt> points to a
|
||||
<tt>lua/</tt> directory inside <tt><CDIR></tt>. (These
|
||||
settings can be overridden by environment variables
|
||||
<tt>LUA_PATH</tt> and <tt>LUA_CPATH</tt>. See the Lua
|
||||
documentation for details.) Here is the standard LuaSocket
|
||||
distribution directory structure:</p>
|
||||
|
||||
<pre class=example>
|
||||
<LDIR>/ltn12.lua
|
||||
<LDIR>/socket.lua
|
||||
<CDIR>/socket/core.dll
|
||||
<LDIR>/socket/http.lua
|
||||
<LDIR>/socket/tp.lua
|
||||
<LDIR>/socket/ftp.lua
|
||||
<LDIR>/socket/smtp.lua
|
||||
<LDIR>/socket/url.lua
|
||||
<LDIR>/mime.lua
|
||||
<CDIR>/mime/core.dll
|
||||
</pre>
|
||||
|
||||
<p> Naturally, on Unix systems, <tt>core.dll</tt>
|
||||
would be replaced by <tt>core.so</tt>.
|
||||
</p>
|
||||
|
||||
<h3>Using LuaSocket</h3>
|
||||
|
||||
<p> With the above setup, and an interpreter with shared library support,
|
||||
it should be easy to use LuaSocket. Just fire the interpreter and use the
|
||||
<tt>require</tt> function to gain access to whatever module you need:</p>
|
||||
|
||||
<pre class=example>
|
||||
Lua 5.2.2 Copyright (C) 1994-2013 Lua.org, PUC-Rio
|
||||
> socket = require("socket")
|
||||
> print(socket._VERSION)
|
||||
--> LuaSocket 3.0.0
|
||||
</pre>
|
||||
|
||||
<p> Each module loads their dependencies automatically, so you only need to
|
||||
load the modules you directly depend upon: </p>
|
||||
|
||||
<pre class=example>
|
||||
Lua 5.2.2 Copyright (C) 1994-2013 Lua.org, PUC-Rio
|
||||
> http = require("socket.http")
|
||||
> print(http.request("http://www.impa.br/~diego/software/luasocket"))
|
||||
--> homepage gets dumped to terminal
|
||||
</pre>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class=footer>
|
||||
<hr>
|
||||
<center>
|
||||
<p class=bar>
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Tue Jun 11 19:06:14 HKT 2013
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
333
src/deps/src/luasocket/docs/introduction.html
vendored
333
src/deps/src/luasocket/docs/introduction.html
vendored
|
|
@ -1,333 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: Introduction to the core">
|
||||
<meta name="keywords" content="Lua, LuaSocket, TCP, UDP, Network,
|
||||
Library, Support">
|
||||
<title>LuaSocket: Introduction to the core</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class=header>
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align=center><a href="http://www.lua.org">
|
||||
<img width=128 height=128 border=0 alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align=center valign=top>Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class=bar>
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- introduction +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2>Introduction</h2>
|
||||
|
||||
<p>
|
||||
LuaSocket is a <a href="http://www.lua.org">Lua</a> extension library
|
||||
that is composed by two parts: a C core that provides support for the TCP
|
||||
and UDP transport layers, and a set of Lua modules that add support for
|
||||
the SMTP (sending e-mails), HTTP (WWW access) and FTP (uploading and
|
||||
downloading files) protocols and other functionality commonly needed by
|
||||
applications that deal with the Internet. This introduction is about the C
|
||||
core.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Communication in LuaSocket is performed via I/O objects. These can
|
||||
represent different network domains. Currently, support is provided for TCP
|
||||
and UDP, but nothing prevents other developers from implementing SSL, Local
|
||||
Domain, Pipes, File Descriptors etc. I/O objects provide a standard
|
||||
interface to I/O across different domains and operating systems.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The API design had two goals in mind. First, users
|
||||
experienced with the C API to sockets should feel comfortable using LuaSocket.
|
||||
Second, the simplicity and the feel of the Lua language should be
|
||||
preserved. To achieve these goals, the LuaSocket API keeps the function names and semantics the C API whenever possible, but their usage in Lua has been greatly simplified.
|
||||
</p>
|
||||
|
||||
|
||||
<p>
|
||||
One of the simplifications is the receive pattern capability.
|
||||
Applications can read data from stream domains (such as TCP)
|
||||
line by line, block by block, or until the connection is closed.
|
||||
All I/O reads are buffered and the performance differences between
|
||||
different receive patterns are negligible.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Another advantage is the flexible timeout control
|
||||
mechanism. As in C, all I/O operations are blocking by default. For
|
||||
example, the <a href=tcp.html#send><tt>send</tt></a>,
|
||||
<a href=tcp.html#receive><tt>receive</tt></a> and
|
||||
<a href=tcp.html#accept><tt>accept</tt></a> methods
|
||||
of the TCP domain will block the caller application until
|
||||
the operation is completed (if ever!). However, with a call to the
|
||||
<a href=tcp.html#settimeout><tt>settimeout</tt></a>
|
||||
method, an application can specify upper limits on
|
||||
the time it can be blocked by LuaSocket (the "<tt>total</tt>" timeout), on
|
||||
the time LuaSocket can internally be blocked by any OS call (the
|
||||
"<tt>block</tt>" timeout) or a combination of the two. Each LuaSocket
|
||||
call might perform several OS calls, so that the two timeout values are
|
||||
<em>not</em> equivalent.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Finally, the host name resolution is transparent, meaning that most
|
||||
functions and methods accept both IP addresses and host names. In case a
|
||||
host name is given, the library queries the system's resolver and
|
||||
tries the main IP address returned. Note that direct use of IP addresses
|
||||
is more efficient, of course. The
|
||||
<a href=dns.html#toip><tt>toip</tt></a>
|
||||
and <a href=dns.html#tohostname><tt>tohostname</tt></a>
|
||||
functions from the DNS module are provided to convert between host names and IP addresses.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Together, these changes make network programming in LuaSocket much simpler
|
||||
than it is in C, as the following sections will show.
|
||||
</p>
|
||||
|
||||
<!-- tcp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id=tcp>TCP</h3>
|
||||
|
||||
<p>
|
||||
TCP (Transfer Control Protocol) is reliable stream protocol. In other
|
||||
words, applications communicating through TCP can send and receive data as
|
||||
an error free stream of bytes. Data is split in one end and
|
||||
reassembled transparently on the other end. There are no boundaries in
|
||||
the data transfers. The library allows users to read data from the
|
||||
sockets in several different granularities: patterns are available for
|
||||
lines, arbitrary sized blocks or "read up to connection closed", all with
|
||||
good performance.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The library distinguishes three types of TCP sockets: <em>master</em>,
|
||||
<em>client</em> and <em>server</em> sockets.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Master sockets are newly created TCP sockets returned by the function
|
||||
<a href=tcp.html#tcp><tt>socket.tcp</tt></a>. A master socket is
|
||||
transformed into a server socket
|
||||
after it is associated with a <em>local</em> address by a call to the
|
||||
<a href=tcp.html#bind><tt>bind</tt></a> method followed by a call to the
|
||||
<a href=tcp.html#listen><tt>listen</tt></a>. Conversely, a master socket
|
||||
can be changed into a client socket with the method
|
||||
<a href=tcp.html#connect><tt>connect</tt></a>,
|
||||
which associates it with a <em>remote</em> address.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
On server sockets, applications can use the
|
||||
<a href=tcp.html#accept><tt>accept</tt></a> method
|
||||
to wait for a client connection. Once a connection is established, a
|
||||
client socket object is returned representing this connection. The
|
||||
other methods available for server socket objects are
|
||||
<a href=tcp.html#getsockname><tt>getsockname</tt></a>,
|
||||
<a href=tcp.html#setoption><tt>setoption</tt></a>,
|
||||
<a href=tcp.html#settimeout><tt>settimeout</tt></a>, and
|
||||
<a href=tcp.html#close><tt>close</tt></a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Client sockets are used to exchange data between two applications over
|
||||
the Internet. Applications can call the methods
|
||||
<a href=tcp.html#send><tt>send</tt></a> and
|
||||
<a href=tcp.html#receive><tt>receive</tt></a>
|
||||
to send and receive data. The other methods
|
||||
available for client socket objects are
|
||||
<a href=tcp.html#getsockname><tt>getsockname</tt></a>,
|
||||
<a href=tcp.html#getpeername><tt>getpeername</tt></a>,
|
||||
<a href=tcp.html#setoption><tt>setoption</tt></a>,
|
||||
<a href=tcp.html#settimeout><tt>settimeout</tt></a>,
|
||||
<a href=tcp.html#shutdown><tt>shutdown</tt></a>, and
|
||||
<a href=tcp.html#close><tt>close</tt></a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Example:
|
||||
</p>
|
||||
<blockquote>
|
||||
<p>
|
||||
A simple echo server, using LuaSocket. The program binds to an ephemeral
|
||||
port (one that is chosen by the operating system) on the local host and
|
||||
awaits client connections on that port. When a connection is established,
|
||||
the program reads a line from the remote end and sends it back, closing
|
||||
the connection immediately. You can test it using the telnet
|
||||
program.
|
||||
</p>
|
||||
|
||||
<pre class=example>
|
||||
-- load namespace
|
||||
local socket = require("socket")
|
||||
-- create a TCP socket and bind it to the local host, at any port
|
||||
local server = assert(socket.bind("*", 0))
|
||||
-- find out which port the OS chose for us
|
||||
local ip, port = server:getsockname()
|
||||
-- print a message informing what's up
|
||||
print("Please telnet to localhost on port " .. port)
|
||||
print("After connecting, you have 10s to enter a line to be echoed")
|
||||
-- loop forever waiting for clients
|
||||
while 1 do
|
||||
-- wait for a connection from any client
|
||||
local client = server:accept()
|
||||
-- make sure we don't block waiting for this client's line
|
||||
client:settimeout(10)
|
||||
-- receive the line
|
||||
local line, err = client:receive()
|
||||
-- if there was no error, send it back to the client
|
||||
if not err then client:send(line .. "\n") end
|
||||
-- done with client, close the object
|
||||
client:close()
|
||||
end
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<!-- udp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id=udp>UDP</h3>
|
||||
|
||||
<p>
|
||||
UDP (User Datagram Protocol) is a non-reliable datagram protocol. In
|
||||
other words, applications communicating through UDP send and receive
|
||||
data as independent blocks, which are not guaranteed to reach the other
|
||||
end. Even when they do reach the other end, they are not guaranteed to be
|
||||
error free. Data transfers are atomic, one datagram at a time. Reading
|
||||
only part of a datagram discards the rest, so that the following read
|
||||
operation will act on the next datagram. The advantages are in
|
||||
simplicity (no connection setup) and performance (no error checking or
|
||||
error correction).
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Note that although no guarantees are made, these days
|
||||
networks are so good that, under normal circumstances, few errors
|
||||
happen in practice.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
An UDP socket object is created by the
|
||||
<a href=udp.html#udp><tt>socket.udp</tt></a> function. UDP
|
||||
sockets do not need to be connected before use. The method
|
||||
<a href=udp.html#sendto><tt>sendto</tt></a>
|
||||
can be used immediately after creation to
|
||||
send a datagram to IP address and port. Host names are not allowed
|
||||
because performing name resolution for each packet would be forbiddingly
|
||||
slow. Methods
|
||||
<a href=udp.html#receive><tt>receive</tt></a> and
|
||||
<a href=udp.html#receivefrom><tt>receivefrom</tt></a>
|
||||
can be used to retrieve datagrams, the latter returning the IP and port of
|
||||
the sender as extra return values (thus being slightly less
|
||||
efficient).
|
||||
</p>
|
||||
|
||||
<p>
|
||||
When communication is performed repeatedly with a single peer, an
|
||||
application should call the
|
||||
<a href=udp.html#setpeername><tt>setpeername</tt></a> method to specify a
|
||||
permanent partner. Methods
|
||||
<a href=udp.html#sendto><tt>sendto</tt></a> and
|
||||
<a href=udp.html#receivefrom><tt>receivefrom</tt></a>
|
||||
can no longer be used, but the method
|
||||
<a href=udp.html#send><tt>send</tt></a> can be used to send data
|
||||
directly to the peer, and the method
|
||||
<a href=udp.html#receive><tt>receive</tt></a>
|
||||
will only return datagrams originating
|
||||
from that peer. There is about 30% performance gain due to this practice.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To associate an UDP socket with a local address, an application calls the
|
||||
<a href=udp.html#setsockname><tt>setsockname</tt></a>
|
||||
method <em>before</em> sending any datagrams. Otherwise, the socket is
|
||||
automatically bound to an ephemeral address before the first data
|
||||
transmission and once bound the local address cannot be changed.
|
||||
The other methods available for UDP sockets are
|
||||
<a href=udp.html#getpeername><tt>getpeername</tt></a>,
|
||||
<a href=udp.html#getsockname><tt>getsockname</tt></a>,
|
||||
<a href=udp.html#settimeout><tt>settimeout</tt></a>,
|
||||
<a href=udp.html#setoption><tt>setoption</tt></a> and
|
||||
<a href=udp.html#close><tt>close</tt></a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Example:
|
||||
</p>
|
||||
<blockquote>
|
||||
<p>
|
||||
A simple daytime client, using LuaSocket. The program connects to a remote
|
||||
server and tries to retrieve the daytime, printing the answer it got or an
|
||||
error message.
|
||||
</p>
|
||||
|
||||
<pre class=example>
|
||||
-- change here to the host an port you want to contact
|
||||
local host, port = "localhost", 13
|
||||
-- load namespace
|
||||
local socket = require("socket")
|
||||
-- convert host name to ip address
|
||||
local ip = assert(socket.dns.toip(host))
|
||||
-- create a new UDP object
|
||||
local udp = assert(socket.udp())
|
||||
-- contact daytime host
|
||||
assert(udp:sendto("anything", ip, port))
|
||||
-- retrieve the answer and print results
|
||||
io.write(assert(udp:receive()))
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<!-- More +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id=more>Support modules</h3>
|
||||
|
||||
<p> Although not covered in the introduction, LuaSocket offers
|
||||
much more than TCP and UDP functionality. As the library
|
||||
evolved, support for <a href=http.html>HTTP</a>, <a href=ftp.html>FTP</a>,
|
||||
and <a href=smtp.html>SMTP</a> were built on top of these. These modules
|
||||
and many others are covered by the <a href=reference.html>reference manual</a>.
|
||||
</p>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class=footer>
|
||||
<hr>
|
||||
<center>
|
||||
<p class=bar>
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:25:36 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
440
src/deps/src/luasocket/docs/ltn12.html
vendored
440
src/deps/src/luasocket/docs/ltn12.html
vendored
|
|
@ -1,440 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: LTN12 support">
|
||||
<meta name="keywords" content="Lua, LuaSocket, Filters, Source, Sink,
|
||||
Pump, Support, Library">
|
||||
<title>LuaSocket: LTN12 module</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- ltn12 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="ltn12">LTN12</h2>
|
||||
|
||||
<p> The <tt>ltn12</tt> namespace implements the ideas described in
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">
|
||||
LTN012, Filters sources and sinks</a>. This manual simply describes the
|
||||
functions. Please refer to the LTN for a deeper explanation of the
|
||||
functionality provided by this module.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To obtain the <tt>ltn12</tt> namespace, run:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- loads the LTN21 module
|
||||
local ltn12 = require("ltn12")
|
||||
</pre>
|
||||
|
||||
<!-- filters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id="filter">Filters</h3>
|
||||
|
||||
<!-- chain ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="filter.chain">
|
||||
ltn12.filter.<b>chain(</b>filter<sub>1</sub>, filter<sub>2</sub>
|
||||
[, ... filter<sub>N</sub>]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns a filter that passes all data it receives through each of a
|
||||
series of given filters.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Filter<sub>1</sub></tt> to <tt>filter<sub>N</sub></tt> are simple
|
||||
filters.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns the chained filter.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
The nesting of filters can be arbitrary. For instance, the useless filter
|
||||
below doesn't do anything but return the data that was passed to it,
|
||||
unaltered.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load required modules
|
||||
local ltn12 = require("ltn12")
|
||||
local mime = require("mime")
|
||||
|
||||
-- create a silly identity filter
|
||||
id = ltn12.filter.chain(
|
||||
mime.encode("quoted-printable"),
|
||||
mime.encode("base64"),
|
||||
mime.decode("base64"),
|
||||
mime.decode("quoted-printable")
|
||||
)
|
||||
</pre>
|
||||
|
||||
<!-- cycle ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="filter.cycle">
|
||||
ltn12.filter.<b>cycle(</b>low [, ctx, extra]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns a high-level filter that cycles though a low-level filter by
|
||||
passing it each chunk and updating a context between calls.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Low</tt> is the low-level filter to be cycled,
|
||||
<tt>ctx</tt> is the initial context and <tt>extra</tt> is any extra
|
||||
argument the low-level filter might take.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns the high-level filter.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the ltn12 module
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- the base64 mime filter factory
|
||||
encodet['base64'] = function()
|
||||
return ltn12.filter.cycle(b64, "")
|
||||
end
|
||||
</pre>
|
||||
|
||||
<!-- pumps ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id="pump">Pumps</h3>
|
||||
|
||||
<!-- all ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="pump.all">
|
||||
ltn12.pump.<b>all(</b>source, sink<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Pumps <em>all</em> data from a <tt>source</tt> to a <tt>sink</tt>.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
If successful, the function returns a value that evaluates to
|
||||
<b><tt>true</tt></b>. In case
|
||||
of error, the function returns a <b><tt>false</tt></b> value, followed by an error message.
|
||||
</p>
|
||||
|
||||
<!-- step +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="pump.step">
|
||||
ltn12.pump.<b>step(</b>source, sink<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Pumps <em>one</em> chunk of data from a <tt>source</tt> to a <tt>sink</tt>.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
If successful, the function returns a value that evaluates to
|
||||
<b><tt>true</tt></b>. In case
|
||||
of error, the function returns a <b><tt>false</tt></b> value, followed by an error message.
|
||||
</p>
|
||||
|
||||
<!-- sinks ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id="sink">Sinks</h3>
|
||||
|
||||
<!-- chain ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sink.chain">
|
||||
ltn12.sink.<b>chain(</b>filter, sink<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a new sink that passes data through a <tt>filter</tt> before sending it to a given <tt>sink</tt>.
|
||||
</p>
|
||||
|
||||
<!-- error ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sink.error">
|
||||
ltn12.sink.<b>error(</b>message<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a sink that aborts transmission with the error
|
||||
<tt>message</tt>.
|
||||
</p>
|
||||
|
||||
<!-- file +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sink.file">
|
||||
ltn12.sink.<b>file(</b>handle, message<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates a sink that sends data to a file.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Handle</tt> is a file handle. If <tt>handle</tt> is <tt><b>nil</b></tt>,
|
||||
<tt>message</tt> should give the reason for failure.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns a sink that sends all data to the given <tt>handle</tt>
|
||||
and closes the file when done, or a sink that aborts the transmission with
|
||||
the error <tt>message</tt>
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
In the following example, notice how the prototype is designed to
|
||||
fit nicely with the <tt>io.open</tt> function.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the ltn12 module
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- copy a file
|
||||
ltn12.pump.all(
|
||||
ltn12.source.file(io.open("original.png", "rb")),
|
||||
ltn12.sink.file(io.open("copy.png", "wb"))
|
||||
)
|
||||
</pre>
|
||||
|
||||
<!-- null +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sink.null">
|
||||
ltn12.sink.<b>null()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns a sink that ignores all data it receives.
|
||||
</p>
|
||||
|
||||
<!-- simplify +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sink.simplify">
|
||||
ltn12.sink.<b>simplify(</b>sink<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a simple sink given a fancy <tt>sink</tt>.
|
||||
</p>
|
||||
|
||||
<!-- table ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sink.table">
|
||||
ltn12.sink.<b>table(</b>[table]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates a sink that stores all chunks in a table. The chunks can later be
|
||||
efficiently concatenated into a single string.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Table</tt> is used to hold the chunks. If
|
||||
<tt><b>nil</b></tt>, the function creates its own table.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns the sink and the table used to store the chunks.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load needed modules
|
||||
local http = require("socket.http")
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- a simplified http.get function
|
||||
function http.get(u)
|
||||
local t = {}
|
||||
local respt = request{
|
||||
url = u,
|
||||
sink = ltn12.sink.table(t)
|
||||
}
|
||||
return table.concat(t), respt.headers, respt.code
|
||||
end
|
||||
</pre>
|
||||
|
||||
<!-- sinks ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id="source">Sources</h3>
|
||||
|
||||
<!-- cat ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source.cat">
|
||||
ltn12.source.<b>cat(</b>source<sub>1</sub> [, source<sub>2</sub>, ...,
|
||||
source<sub>N</sub>]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates a new source that produces the concatenation of the data produced
|
||||
by a number of sources.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Source<sub>1</sub></tt> to <tt>source<sub>N</sub></tt> are the original
|
||||
sources.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns the new source.
|
||||
</p>
|
||||
|
||||
<!-- chain ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source.chain">
|
||||
ltn12.source.<b>chain(</b>source, filter<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates a new <tt>source</tt> that passes data through a <tt>filter</tt>
|
||||
before returning it.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns the new source.
|
||||
</p>
|
||||
|
||||
<!-- empty ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source.empty">
|
||||
ltn12.source.<b>empty()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns an empty source.
|
||||
</p>
|
||||
|
||||
<!-- error ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source.error">
|
||||
ltn12.source.<b>error(</b>message<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a source that aborts transmission with the error
|
||||
<tt>message</tt>.
|
||||
</p>
|
||||
|
||||
<!-- file +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source.file">
|
||||
ltn12.source.<b>file(</b>handle, message<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates a source that produces the contents of a file.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Handle</tt> is a file handle. If <tt>handle</tt> is <tt><b>nil</b></tt>,
|
||||
<tt>message</tt> should give the reason for failure.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns a source that reads chunks of data from
|
||||
given <tt>handle</tt> and returns it to the user,
|
||||
closing the file when done, or a source that aborts the transmission with
|
||||
the error <tt>message</tt>
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
In the following example, notice how the prototype is designed to
|
||||
fit nicely with the <tt>io.open</tt> function.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the ltn12 module
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- copy a file
|
||||
ltn12.pump.all(
|
||||
ltn12.source.file(io.open("original.png", "rb")),
|
||||
ltn12.sink.file(io.open("copy.png", "wb"))
|
||||
)
|
||||
</pre>
|
||||
|
||||
<!-- simplify +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source.simplify">
|
||||
ltn12.source.<b>simplify(</b>source<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a simple source given a fancy <tt>source</tt>.
|
||||
</p>
|
||||
|
||||
<!-- string +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source.string">
|
||||
ltn12.source.<b>string(</b>string<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a source that produces the contents of a
|
||||
<tt>string</tt>, chunk by chunk.
|
||||
</p>
|
||||
|
||||
<!-- table +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source.table">
|
||||
ltn12.source.<b>table(</b>table<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a source that produces the numerically-indexed values of a <tt>table</tt> successively beginning at 1. The source returns nil (end-of-stream) whenever a nil value is produced by the current index, which proceeds forward regardless.
|
||||
</p>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:25:41 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
BIN
src/deps/src/luasocket/docs/lua05.ppt
vendored
BIN
src/deps/src/luasocket/docs/lua05.ppt
vendored
Binary file not shown.
BIN
src/deps/src/luasocket/docs/luasocket.png
vendored
BIN
src/deps/src/luasocket/docs/luasocket.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
477
src/deps/src/luasocket/docs/mime.html
vendored
477
src/deps/src/luasocket/docs/mime.html
vendored
|
|
@ -1,477 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: MIME support">
|
||||
<meta name="keywords" content="Lua, LuaSocket, MIME, Library, Support">
|
||||
<title>LuaSocket: MIME module</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- mime +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="mime">MIME</h2>
|
||||
|
||||
<p>
|
||||
The <tt>mime</tt> namespace offers filters that apply and remove common
|
||||
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
|
||||
<a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>,
|
||||
<a href="http://www.ietf.org/rfc/rfc2046.txt">2046</a>,
|
||||
<a href="http://www.ietf.org/rfc/rfc2047.txt">2047</a>,
|
||||
<a href="http://www.ietf.org/rfc/rfc2047.txt">2048</a>, and
|
||||
<a href="http://www.ietf.org/rfc/rfc2048.txt">2049</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
All functionality provided by the MIME module
|
||||
follows the ideas presented in
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">
|
||||
LTN012, Filters sources and sinks</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To obtain the <tt>mime</tt> namespace, run:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- loads the MIME module and everything it requires
|
||||
local mime = require("mime")
|
||||
</pre>
|
||||
|
||||
|
||||
<!-- High-level +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id="high">High-level filters</h3>
|
||||
|
||||
|
||||
<!-- decode +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="decode">
|
||||
mime.<b>decode(</b>"base64"<b>)</b><br>
|
||||
mime.<b>decode(</b>"quoted-printable"<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns a filter that decodes data from a given transfer content
|
||||
encoding.
|
||||
</p>
|
||||
|
||||
<!-- encode +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="encode">
|
||||
mime.<b>encode(</b>"base64"<b>)</b><br>
|
||||
mime.<b>encode(</b>"quoted-printable" [, mode]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns a filter that encodes data according to a given transfer content
|
||||
encoding.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
In the Quoted-Printable case, the user can specify whether the data is
|
||||
textual or binary, by passing the <tt>mode</tt> strings "<tt>text</tt>" or
|
||||
"<tt>binary</tt>". <tt>Mode</tt> defaults to "<tt>text</tt>".
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Although both transfer content encodings specify a limit for the line
|
||||
length, the encoding filters do <em>not</em> break text into lines (for
|
||||
added flexibility).
|
||||
Below is a filter that converts binary data to the Base64 transfer content
|
||||
encoding and breaks it into lines of the correct size.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
base64 = ltn12.filter.chain(
|
||||
mime.encode("base64"),
|
||||
mime.wrap("base64")
|
||||
)
|
||||
</pre>
|
||||
|
||||
<p class="note">
|
||||
Note: Text data <em>has</em> to be converted to canonic form
|
||||
<em>before</em> being encoded.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
base64 = ltn12.filter.chain(
|
||||
mime.normalize(),
|
||||
mime.encode("base64"),
|
||||
mime.wrap("base64")
|
||||
)
|
||||
</pre>
|
||||
|
||||
<!-- normalize ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="normalize">
|
||||
mime.<b>normalize(</b>[marker]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Converts most common end-of-line markers to a specific given marker.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Marker</tt> is the new marker. It defaults to CRLF, the canonic
|
||||
end-of-line marker defined by the MIME standard.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns a filter that performs the conversion.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: There is no perfect solution to this problem. Different end-of-line
|
||||
markers are an evil that will probably plague developers forever.
|
||||
This function, however, will work perfectly for text created with any of
|
||||
the most common end-of-line markers, i.e. the Mac OS (CR), the Unix (LF),
|
||||
or the DOS (CRLF) conventions. Even if the data has mixed end-of-line
|
||||
markers, the function will still work well, although it doesn't
|
||||
guarantee that the number of empty lines will be correct.
|
||||
</p>
|
||||
|
||||
<!-- stuff +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="stuff">
|
||||
mime.<b>stuff()</b><br>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a filter that performs stuffing of SMTP messages.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The <a href="smtp.html#send"><tt>smtp.send</tt></a> function
|
||||
uses this filter automatically. You don't need to chain it with your
|
||||
source, or apply it to your message body.
|
||||
</p>
|
||||
|
||||
<!-- wrap +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="wrap">
|
||||
mime.<b>wrap(</b>"text" [, length]<b>)</b><br>
|
||||
mime.<b>wrap(</b>"base64"<b>)</b><br>
|
||||
mime.<b>wrap(</b>"quoted-printable"<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns a filter that breaks data into lines.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
The "<tt>text</tt>" line-wrap filter simply breaks text into lines by
|
||||
inserting CRLF end-of-line markers at appropriate positions.
|
||||
<tt>Length</tt> defaults 76.
|
||||
The "<tt>base64</tt>" line-wrap filter works just like the default
|
||||
"<tt>text</tt>" line-wrap filter with default length.
|
||||
The function can also wrap "<tt>quoted-printable</tt>" lines, taking care
|
||||
not to break lines in the middle of an escaped character. In that case, the
|
||||
line length is fixed at 76.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
For example, to create an encoding filter for the Quoted-Printable transfer content encoding of text data, do the following:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
qp = ltn12.filter.chain(
|
||||
mime.normalize(),
|
||||
mime.encode("quoted-printable"),
|
||||
mime.wrap("quoted-printable")
|
||||
)
|
||||
</pre>
|
||||
|
||||
<p class="note">
|
||||
Note: To break into lines with a different end-of-line convention, apply
|
||||
a normalization filter after the line break filter.
|
||||
</p>
|
||||
|
||||
<!-- Low-level ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h3 id="low">Low-level filters</h3>
|
||||
|
||||
<!-- b64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="b64">
|
||||
A, B = mime.<b>b64(</b>C [, D]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Low-level filter to perform Base64 encoding.
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
<tt>A</tt> is the encoded version of the largest prefix of
|
||||
<tt>C..D</tt>
|
||||
that can be encoded unambiguously. <tt>B</tt> has the remaining bytes of
|
||||
<tt>C..D</tt>, <em>before</em> encoding.
|
||||
If <tt>D</tt> is <tt><b>nil</b></tt>, <tt>A</tt> is padded with
|
||||
the encoding of the remaining bytes of <tt>C</tt>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The simplest use of this function is to encode a string into it's
|
||||
Base64 transfer content encoding. Notice the extra parenthesis around the
|
||||
call to <tt>mime.b64</tt>, to discard the second return value.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
print((mime.b64("diego:password")))
|
||||
--> ZGllZ286cGFzc3dvcmQ=
|
||||
</pre>
|
||||
|
||||
<!-- dot +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
<p class="name" id="dot">
|
||||
A, n = mime.<b>dot(</b>m [, B]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Low-level filter to perform SMTP stuffing and enable transmission of
|
||||
messages containing the sequence "CRLF.CRLF".
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>A</tt> is the stuffed version of <tt>B</tt>. '<tt>n</tt>' gives the
|
||||
number of characters from the sequence CRLF seen in the end of <tt>B</tt>.
|
||||
'<tt>m</tt>' should tell the same, but for the previous chunk.
|
||||
</p>
|
||||
|
||||
<p class="note">Note: The message body is defined to begin with
|
||||
an implicit CRLF. Therefore, to stuff a message correctly, the
|
||||
first <tt>m</tt> should have the value 2.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
print((string.gsub(mime.dot(2, ".\r\nStuffing the message.\r\n.\r\n."), "\r\n", "\\n")))
|
||||
--> ..\nStuffing the message.\n..\n..
|
||||
</pre>
|
||||
|
||||
<p class="note">
|
||||
Note: The <a href="smtp.html#send"><tt>smtp.send</tt></a> function
|
||||
uses this filter automatically. You don't need to
|
||||
apply it again.
|
||||
</p>
|
||||
|
||||
<!-- eol ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="eol">
|
||||
A, B = mime.<b>eol(</b>C [, D, marker]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Low-level filter to perform end-of-line marker translation.
|
||||
For each chunk, the function needs to know if the last character of the
|
||||
previous chunk could be part of an end-of-line marker or not. This is the
|
||||
context the function receives besides the chunk. An updated version of
|
||||
the context is returned after each new chunk.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>A</tt> is the translated version of <tt>D</tt>. <tt>C</tt> is the
|
||||
ASCII value of the last character of the previous chunk, if it was a
|
||||
candidate for line break, or 0 otherwise.
|
||||
<tt>B</tt> is the same as <tt>C</tt>, but for the current
|
||||
chunk. <tt>Marker</tt> gives the new end-of-line marker and defaults to CRLF.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- translates the end-of-line marker to UNIX
|
||||
unix = mime.eol(0, dos, "\n")
|
||||
</pre>
|
||||
|
||||
<!-- qp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="qp">
|
||||
A, B = mime.<b>qp(</b>C [, D, marker]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Low-level filter to perform Quoted-Printable encoding.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>A</tt> is the encoded version of the largest prefix of
|
||||
<tt>C..D</tt>
|
||||
that can be encoded unambiguously. <tt>B</tt> has the remaining bytes of
|
||||
<tt>C..D</tt>, <em>before</em> encoding.
|
||||
If <tt>D</tt> is <tt><b>nil</b></tt>, <tt>A</tt> is padded with
|
||||
the encoding of the remaining bytes of <tt>C</tt>.
|
||||
Throughout encoding, occurrences of CRLF are replaced by the
|
||||
<tt>marker</tt>, which itself defaults to CRLF.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The simplest use of this function is to encode a string into it's
|
||||
Quoted-Printable transfer content encoding.
|
||||
Notice the extra parenthesis around the call to <tt>mime.qp</tt>, to discard the second return value.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
print((mime.qp("ma<6D><61>")))
|
||||
--> ma=E7=E3=
|
||||
</pre>
|
||||
|
||||
<!-- qpwrp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="qpwrp">
|
||||
A, m = mime.<b>qpwrp(</b>n [, B, length]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Low-level filter to break Quoted-Printable text into lines.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>A</tt> is a copy of <tt>B</tt>, broken into lines of at most
|
||||
<tt>length</tt> bytes (defaults to 76).
|
||||
'<tt>n</tt>' should tell how many bytes are left for the first
|
||||
line of <tt>B</tt> and '<tt>m</tt>' returns the number of bytes
|
||||
left in the last line of <tt>A</tt>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: Besides breaking text into lines, this function makes sure the line
|
||||
breaks don't fall in the middle of an escaped character combination. Also,
|
||||
this function only breaks lines that are bigger than <tt>length</tt> bytes.
|
||||
</p>
|
||||
|
||||
<!-- unb64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="unb64">
|
||||
A, B = mime.<b>unb64(</b>C [, D]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Low-level filter to perform Base64 decoding.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>A</tt> is the decoded version of the largest prefix of
|
||||
<tt>C..D</tt>
|
||||
that can be decoded unambiguously. <tt>B</tt> has the remaining bytes of
|
||||
<tt>C..D</tt>, <em>before</em> decoding.
|
||||
If <tt>D</tt> is <tt><b>nil</b></tt>, <tt>A</tt> is the empty string
|
||||
and <tt>B</tt> returns whatever couldn't be decoded.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The simplest use of this function is to decode a string from it's
|
||||
Base64 transfer content encoding.
|
||||
Notice the extra parenthesis around the call to <tt>mime.unqp</tt>, to discard the second return value.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
print((mime.unb64("ZGllZ286cGFzc3dvcmQ=")))
|
||||
--> diego:password
|
||||
</pre>
|
||||
|
||||
<!-- unqp +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="unqp">
|
||||
A, B = mime.<b>unqp(</b>C [, D]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Low-level filter to remove the Quoted-Printable transfer content encoding
|
||||
from data.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>A</tt> is the decoded version of the largest prefix of
|
||||
<tt>C..D</tt>
|
||||
that can be decoded unambiguously. <tt>B</tt> has the remaining bytes of
|
||||
<tt>C..D</tt>, <em>before</em> decoding.
|
||||
If <tt>D</tt> is <tt><b>nil</b></tt>, <tt>A</tt> is augmented with
|
||||
the encoding of the remaining bytes of <tt>C</tt>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The simplest use of this function is to decode a string from it's
|
||||
Quoted-Printable transfer content encoding.
|
||||
Notice the extra parenthesis around the call to <tt>mime.unqp</tt>, to discard the second return value.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
print((mime.qp("ma=E7=E3=")))
|
||||
--> ma<6D><61>
|
||||
</pre>
|
||||
|
||||
<!-- wrp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="wrp">
|
||||
A, m = mime.<b>wrp(</b>n [, B, length]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Low-level filter to break text into lines with CRLF marker.
|
||||
Text is assumed to be in the <a href="#normalize"><tt>normalize</tt></a> form.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>A</tt> is a copy of <tt>B</tt>, broken into lines of at most
|
||||
<tt>length</tt> bytes (defaults to 76).
|
||||
'<tt>n</tt>' should tell how many bytes are left for the first
|
||||
line of <tt>B</tt> and '<tt>m</tt>' returns the number of bytes
|
||||
left in the last line of <tt>A</tt>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: This function only breaks lines that are bigger than
|
||||
<tt>length</tt> bytes. The resulting line length does not include the CRLF
|
||||
marker.
|
||||
</p>
|
||||
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Fri Mar 4 15:19:17 BRT 2016
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
55
src/deps/src/luasocket/docs/reference.css
vendored
55
src/deps/src/luasocket/docs/reference.css
vendored
|
|
@ -1,55 +0,0 @@
|
|||
body {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
font-family: "Verdana", sans-serif;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
tt {
|
||||
font-family: "Andale Mono", monospace;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 { margin-left: 0em; }
|
||||
|
||||
|
||||
h3 { padding-top: 1em; }
|
||||
|
||||
p { margin-left: 1em; }
|
||||
|
||||
p.name {
|
||||
font-family: "Andale Mono", monospace;
|
||||
padding-top: 1em;
|
||||
margin-left: 0em;
|
||||
}
|
||||
|
||||
a[href] { color: #00007f; }
|
||||
|
||||
blockquote { margin-left: 3em; }
|
||||
|
||||
pre.example {
|
||||
background: #ccc;
|
||||
padding: 1em;
|
||||
margin-left: 1em;
|
||||
font-family: "Andale Mono", monospace;
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin-left: 0em;
|
||||
background: #00007f;
|
||||
border: 0px;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
ul { list-style-type: disc; }
|
||||
|
||||
table.index { border: 1px #00007f; }
|
||||
table.index td { text-align: left; vertical-align: top; }
|
||||
table.index ul { padding-top: 0em; margin-top: 0em; }
|
||||
|
||||
h1:first-letter,
|
||||
h2:first-letter,
|
||||
h2:first-letter,
|
||||
h3:first-letter { color: #00007f; }
|
||||
|
||||
div.header, div.footer { margin-left: 0em; }
|
||||
261
src/deps/src/luasocket/docs/reference.html
vendored
261
src/deps/src/luasocket/docs/reference.html
vendored
|
|
@ -1,261 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: Index to reference manual">
|
||||
<meta name="keywords" content="Lua, LuaSocket, Index, Manual, Network, Library,
|
||||
Support, Manual">
|
||||
<title>LuaSocket: Index to reference manual</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- reference +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2>Reference</h2>
|
||||
|
||||
<blockquote>
|
||||
<a href="dns.html">DNS (in socket)</a>
|
||||
<blockquote>
|
||||
<a href="dns.html#getaddrinfo">getaddrinfo</a>,
|
||||
<a href="dns.html#gethostname">gethostname</a>,
|
||||
<a href="dns.html#tohostname">tohostname</a>,
|
||||
<a href="dns.html#toip">toip</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- ftp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="ftp.html">FTP</a>
|
||||
<blockquote>
|
||||
<a href="ftp.html#get">get</a>,
|
||||
<a href="ftp.html#put">put</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- http +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="http.html">HTTP</a>
|
||||
<blockquote>
|
||||
<a href="http.html#request">request</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- ltn12 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="ltn12.html">LTN12</a>
|
||||
<blockquote>
|
||||
<a href="ltn12.html#filter">filter</a>:
|
||||
<a href="ltn12.html#filter.chain">chain</a>,
|
||||
<a href="ltn12.html#filter.cycle">cycle</a>.
|
||||
</blockquote>
|
||||
<blockquote>
|
||||
<a href="ltn12.html#pump">pump</a>:
|
||||
<a href="ltn12.html#pump.all">all</a>,
|
||||
<a href="ltn12.html#pump.step">step</a>.
|
||||
</blockquote>
|
||||
<blockquote>
|
||||
<a href="ltn12.html#sink">sink</a>:
|
||||
<a href="ltn12.html#sink.chain">chain</a>,
|
||||
<a href="ltn12.html#sink.error">error</a>,
|
||||
<a href="ltn12.html#sink.file">file</a>,
|
||||
<a href="ltn12.html#sink.null">null</a>,
|
||||
<a href="ltn12.html#sink.simplify">simplify</a>,
|
||||
<a href="ltn12.html#sink.table">table</a>.
|
||||
</blockquote>
|
||||
<blockquote>
|
||||
<a href="ltn12.html#source">source</a>:
|
||||
<a href="ltn12.html#source.cat">cat</a>,
|
||||
<a href="ltn12.html#source.chain">chain</a>,
|
||||
<a href="ltn12.html#source.empty">empty</a>,
|
||||
<a href="ltn12.html#source.error">error</a>,
|
||||
<a href="ltn12.html#source.file">file</a>,
|
||||
<a href="ltn12.html#source.simplify">simplify</a>,
|
||||
<a href="ltn12.html#source.string">string</a>,
|
||||
<a href="ltn12.html#source.table">table</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- mime +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="mime.html">MIME</a>
|
||||
<blockquote>
|
||||
<a href="mime.html#high">high-level</a>:
|
||||
<a href="mime.html#decode">decode</a>,
|
||||
<a href="mime.html#encode">encode</a>,
|
||||
<a href="mime.html#normalize">normalize</a>,
|
||||
<a href="mime.html#stuff">stuff</a>,
|
||||
<a href="mime.html#wrap">wrap</a>.
|
||||
</blockquote>
|
||||
<blockquote>
|
||||
<a href="mime.html#low">low-level</a>:
|
||||
<a href="mime.html#b64">b64</a>,
|
||||
<a href="mime.html#dot">dot</a>,
|
||||
<a href="mime.html#eol">eol</a>,
|
||||
<a href="mime.html#qp">qp</a>,
|
||||
<a href="mime.html#qpwrp">qpwrp</a>,
|
||||
<a href="mime.html#unb64">unb64</a>,
|
||||
<a href="mime.html#unqp">unqp</a>,
|
||||
<a href="mime.html#wrp">wrp</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- smtp +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="smtp.html">SMTP</a>
|
||||
<blockquote>
|
||||
<a href="smtp.html#message">message</a>,
|
||||
<a href="smtp.html#send">send</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- socket +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="socket.html">Socket</a>
|
||||
<blockquote>
|
||||
<a href="socket.html#bind">bind</a>,
|
||||
<a href="socket.html#connect">connect</a>,
|
||||
<a href="socket.html#connect">connect4</a>,
|
||||
<a href="socket.html#connect">connect6</a>,
|
||||
<a href="socket.html#datagramsize">_DATAGRAMSIZE</a>,
|
||||
<a href="socket.html#debug">_DEBUG</a>,
|
||||
<a href="dns.html#dns">dns</a>,
|
||||
<a href="socket.html#gettime">gettime</a>,
|
||||
<a href="socket.html#headers.canonic">headers.canonic</a>,
|
||||
<a href="socket.html#newtry">newtry</a>,
|
||||
<a href="socket.html#protect">protect</a>,
|
||||
<a href="socket.html#select">select</a>,
|
||||
<a href="socket.html#sink">sink</a>,
|
||||
<a href="socket.html#skip">skip</a>,
|
||||
<a href="socket.html#sleep">sleep</a>,
|
||||
<a href="socket.html#setsize">_SETSIZE</a>,
|
||||
<a href="socket.html#socketinvalid">_SOCKETINVALID</a>,
|
||||
<a href="socket.html#source">source</a>,
|
||||
<a href="tcp.html#socket.tcp">tcp</a>,
|
||||
<a href="tcp.html#socket.tcp4">tcp4</a>,
|
||||
<a href="tcp.html#socket.tcp6">tcp6</a>,
|
||||
<a href="socket.html#try">try</a>,
|
||||
<a href="udp.html#socket.udp">udp</a>,
|
||||
<a href="udp.html#socket.udp4">udp4</a>,
|
||||
<a href="udp.html#socket.udp6">udp6</a>,
|
||||
<a href="socket.html#version">_VERSION</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- tcp +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="tcp.html">TCP (in socket)</a>
|
||||
<blockquote>
|
||||
<a href="tcp.html#accept">accept</a>,
|
||||
<a href="tcp.html#bind">bind</a>,
|
||||
<a href="tcp.html#close">close</a>,
|
||||
<a href="tcp.html#connect">connect</a>,
|
||||
<a href="tcp.html#dirty">dirty</a>,
|
||||
<a href="tcp.html#getfd">getfd</a>,
|
||||
<a href="tcp.html#getoption">getoption</a>,
|
||||
<a href="tcp.html#getpeername">getpeername</a>,
|
||||
<a href="tcp.html#getsockname">getsockname</a>,
|
||||
<a href="tcp.html#getstats">getstats</a>,
|
||||
<a href="tcp.html#gettimeout">gettimeout</a>,
|
||||
<a href="tcp.html#listen">listen</a>,
|
||||
<a href="tcp.html#receive">receive</a>,
|
||||
<a href="tcp.html#send">send</a>,
|
||||
<a href="tcp.html#setfd">setfd</a>,
|
||||
<a href="tcp.html#setoption">setoption</a>,
|
||||
<a href="tcp.html#setstats">setstats</a>,
|
||||
<a href="tcp.html#settimeout">settimeout</a>,
|
||||
<a href="tcp.html#shutdown">shutdown</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- udp +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="udp.html">UDP (in socket)</a>
|
||||
<blockquote>
|
||||
<a href="udp.html#close">close</a>,
|
||||
<a href="udp.html#getoption">getoption</a>,
|
||||
<a href="udp.html#getpeername">getpeername</a>,
|
||||
<a href="udp.html#getsockname">getsockname</a>,
|
||||
<a href="udp.html#gettimeout">gettimeout</a>,
|
||||
<a href="udp.html#receive">receive</a>,
|
||||
<a href="udp.html#receivefrom">receivefrom</a>,
|
||||
<a href="udp.html#send">send</a>,
|
||||
<a href="udp.html#sendto">sendto</a>,
|
||||
<a href="udp.html#setpeername">setpeername</a>,
|
||||
<a href="udp.html#setsockname">setsockname</a>,
|
||||
<a href="udp.html#setoption">setoption</a>,
|
||||
<a href="udp.html#settimeout">settimeout</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- url ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<blockquote>
|
||||
<a href="url.html">URL</a>
|
||||
<blockquote>
|
||||
<a href="url.html#absolute">absolute</a>,
|
||||
<a href="url.html#build">build</a>,
|
||||
<a href="url.html#build_path">build_path</a>,
|
||||
<a href="url.html#escape">escape</a>,
|
||||
<a href="url.html#parse">parse</a>,
|
||||
<a href="url.html#parse_path">parse_path</a>,
|
||||
<a href="url.html#unescape">unescape</a>.
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<!-- footer ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:25:47 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
419
src/deps/src/luasocket/docs/smtp.html
vendored
419
src/deps/src/luasocket/docs/smtp.html
vendored
|
|
@ -1,419 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: SMTP support">
|
||||
<meta name="keywords" content="Lua, LuaSocket, SMTP, E-Mail, MIME, Multipart,
|
||||
Library, Support">
|
||||
<title>LuaSocket: SMTP support</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- smtp +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="smtp">SMTP</h2>
|
||||
|
||||
<p> The <tt>smtp</tt> namespace provides functionality to send e-mail
|
||||
messages. The high-level API consists of two functions: one to
|
||||
define an e-mail message, and another to actually send the message.
|
||||
Although almost all users will find that these functions provide more than
|
||||
enough functionality, the underlying implementation allows for even more
|
||||
control (if you bother to read the code).
|
||||
</p>
|
||||
|
||||
<p>The implementation conforms to the Simple Mail Transfer Protocol,
|
||||
<a href="http://www.ietf.org/rfc/rfc2821.txt">RFC 2821</a>.
|
||||
Another RFC of interest is <a
|
||||
href="http://www.ietf.org/rfc/rfc2822.txt">RFC 2822</a>,
|
||||
which governs the Internet Message Format.
|
||||
Multipart messages (those that contain attachments) are part
|
||||
of the MIME standard, but described mainly
|
||||
in <a href="http://www.ietf.org/rfc/rfc2046.txt">RFC 2046</a>.</p>
|
||||
|
||||
<p> In the description below, good understanding of <a
|
||||
href="http://lua-users.org/wiki/FiltersSourcesAndSinks"> LTN012, Filters
|
||||
sources and sinks</a> and the <a href="mime.html">MIME</a> module is
|
||||
assumed. In fact, the SMTP module was the main reason for their
|
||||
creation. </p>
|
||||
|
||||
<p>
|
||||
To obtain the <tt>smtp</tt> namespace, run:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- loads the SMTP module and everything it requires
|
||||
local smtp = require("socket.smtp")
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
MIME headers are represented as a Lua table in the form:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<table summary="MIME headers in Lua table">
|
||||
<tr><td><tt>
|
||||
headers = {<br>
|
||||
field-1-name = <i>field-1-value</i>,<br>
|
||||
field-2-name = <i>field-2-value</i>,<br>
|
||||
field-3-name = <i>field-3-value</i>,<br>
|
||||
...<br>
|
||||
field-n-name = <i>field-n-value</i><br>
|
||||
}
|
||||
</tt></td></tr>
|
||||
</table>
|
||||
</blockquote>
|
||||
|
||||
<p>
|
||||
Field names are case insensitive (as specified by the standard) and all
|
||||
functions work with lowercase field names (but see
|
||||
<a href="socket.html#headers.canonic"><tt>socket.headers.canonic</tt></a>).
|
||||
Field values are left unmodified.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: MIME headers are independent of order. Therefore, there is no problem
|
||||
in representing them in a Lua table.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The following constants can be set to control the default behavior of
|
||||
the SMTP module:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li> <tt>DOMAIN</tt>: domain used to greet the server;</li>
|
||||
<li> <tt>PORT</tt>: default port used for the connection;</li>
|
||||
<li> <tt>SERVER</tt>: default server used for the connection;</li>
|
||||
<li> <tt>TIMEOUT</tt>: default timeout for all I/O operations;</li>
|
||||
<li> <tt>ZONE</tt>: default time zone.</li>
|
||||
</ul>
|
||||
|
||||
<!-- message ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="message">
|
||||
smtp.<b>message(</b>mesgt<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns a <em>simple</em>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> source that sends an SMTP message body, possibly multipart (arbitrarily deep).
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
The only parameter of the function is a table describing the message.
|
||||
<tt>Mesgt</tt> has the following form (notice the recursive structure):
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<table summary="Mesgt table structure">
|
||||
<tr><td><tt>
|
||||
mesgt = {<br>
|
||||
headers = <i>header-table</i>,<br>
|
||||
body = <i>LTN12 source</i> or <i>string</i> or
|
||||
<i>multipart-mesgt</i><br>
|
||||
}<br>
|
||||
<br>
|
||||
multipart-mesgt = {<br>
|
||||
[preamble = <i>string</i>,]<br>
|
||||
[1] = <i>mesgt</i>,<br>
|
||||
[2] = <i>mesgt</i>,<br>
|
||||
...<br>
|
||||
[<i>n</i>] = <i>mesgt</i>,<br>
|
||||
[epilogue = <i>string</i>,]<br>
|
||||
}<br>
|
||||
</tt></td></tr>
|
||||
</table>
|
||||
</blockquote>
|
||||
|
||||
<p class="parameters">
|
||||
For a simple message, all that is needed is a set of <tt>headers</tt>
|
||||
and the <tt>body</tt>. The message <tt>body</tt> can be given as a string
|
||||
or as a <em>simple</em>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
source. For multipart messages, the body is a table that
|
||||
recursively defines each part as an independent message, plus an optional
|
||||
<tt>preamble</tt> and <tt>epilogue</tt>.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns a <em>simple</em>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
source that produces the
|
||||
message contents as defined by <tt>mesgt</tt>, chunk by chunk.
|
||||
Hopefully, the following
|
||||
example will make things clear. When in doubt, refer to the appropriate RFC
|
||||
as listed in the introduction. </p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the smtp support and its friends
|
||||
local smtp = require("socket.smtp")
|
||||
local mime = require("mime")
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- creates a source to send a message with two parts. The first part is
|
||||
-- plain text, the second part is a PNG image, encoded as base64.
|
||||
source = smtp.message{
|
||||
headers = {
|
||||
-- Remember that headers are *ignored* by smtp.send.
|
||||
from = "Sicrano de Oliveira <sicrano@example.com>",
|
||||
to = "Fulano da Silva <fulano@example.com>",
|
||||
subject = "Here is a message with attachments"
|
||||
},
|
||||
body = {
|
||||
preamble = "If your client doesn't understand attachments, \r\n" ..
|
||||
"it will still display the preamble and the epilogue.\r\n" ..
|
||||
"Preamble will probably appear even in a MIME enabled client.",
|
||||
-- first part: no headers means plain text, us-ascii.
|
||||
-- The mime.eol low-level filter normalizes end-of-line markers.
|
||||
[1] = {
|
||||
body = mime.eol(0, [[
|
||||
Lines in a message body should always end with CRLF.
|
||||
The smtp module will *NOT* perform translation. However, the
|
||||
send function *DOES* perform SMTP stuffing, whereas the message
|
||||
function does *NOT*.
|
||||
]])
|
||||
},
|
||||
-- second part: headers describe content to be a png image,
|
||||
-- sent under the base64 transfer content encoding.
|
||||
-- notice that nothing happens until the message is actually sent.
|
||||
-- small chunks are loaded into memory right before transmission and
|
||||
-- translation happens on the fly.
|
||||
[2] = {
|
||||
headers = {
|
||||
["content-type"] = 'image/png; name="image.png"',
|
||||
["content-disposition"] = 'attachment; filename="image.png"',
|
||||
["content-description"] = 'a beautiful image',
|
||||
["content-transfer-encoding"] = "BASE64"
|
||||
},
|
||||
body = ltn12.source.chain(
|
||||
ltn12.source.file(io.open("image.png", "rb")),
|
||||
ltn12.filter.chain(
|
||||
mime.encode("base64"),
|
||||
mime.wrap()
|
||||
)
|
||||
)
|
||||
},
|
||||
epilogue = "This might also show up, but after the attachments"
|
||||
}
|
||||
}
|
||||
|
||||
-- finally send it
|
||||
r, e = smtp.send{
|
||||
from = "<sicrano@example.com>",
|
||||
rcpt = "<fulano@example.com>",
|
||||
source = source,
|
||||
}
|
||||
</pre>
|
||||
|
||||
|
||||
<!-- send +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="send">
|
||||
smtp.<b>send{</b><br>
|
||||
from = <i>string</i>,<br>
|
||||
rcpt = <i>string</i> or <i>string-table</i>,<br>
|
||||
source = <i>LTN12 source</i>,<br>
|
||||
[user = <i>string</i>,]<br>
|
||||
[password = <i>string</i>,]<br>
|
||||
[server = <i>string</i>,]<br>
|
||||
[port = <i>number</i>,]<br>
|
||||
[domain = <i>string</i>,]<br>
|
||||
[step = <i>LTN12 pump step</i>,]<br>
|
||||
[create = <i>function</i>]<br>
|
||||
<b>}</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Sends a message to a recipient list. Since sending messages is not as
|
||||
simple as downloading an URL from a FTP or HTTP server, this function
|
||||
doesn't have a simple interface. However, see the
|
||||
<a href="#message"><tt>message</tt></a> source factory for
|
||||
a very powerful way to define the message contents.
|
||||
</p>
|
||||
|
||||
|
||||
<p class="parameters">
|
||||
The sender is given by the e-mail address in the <tt>from</tt> field.
|
||||
<tt>Rcpt</tt> is a Lua table with one entry for each recipient e-mail
|
||||
address, or a string
|
||||
in case there is just one recipient.
|
||||
The contents of the message are given by a <em>simple</em>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
<tt>source</tt>. Several arguments are optional:
|
||||
</p>
|
||||
<ul>
|
||||
<li> <tt>user</tt>, <tt>password</tt>: User and password for
|
||||
authentication. The function will attempt LOGIN and PLAIN authentication
|
||||
methods if supported by the server (both are unsafe);</li>
|
||||
<li> <tt>server</tt>: Server to connect to. Defaults to "localhost";</li>
|
||||
<li> <tt>port</tt>: Port to connect to. Defaults to 25;</li>
|
||||
<li> <tt>domain</tt>: Domain name used to greet the server; Defaults to the
|
||||
local machine host name;</li>
|
||||
<li> <tt>step</tt>:
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
pump step function used to pass data from the
|
||||
source to the server. Defaults to the LTN12 <tt>pump.step</tt> function;</li>
|
||||
<li><tt>create</tt>: An optional function to be used instead of
|
||||
<a href="tcp.html#socket.tcp"><tt>socket.tcp</tt></a> when the communications socket is created.</li>
|
||||
</ul>
|
||||
|
||||
<p class="return">
|
||||
If successful, the function returns 1. Otherwise, the function returns
|
||||
<b><tt>nil</tt></b> followed by an error message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: SMTP servers can be very picky with the format of e-mail
|
||||
addresses. To be safe, use only addresses of the form
|
||||
"<tt><fulano@example.com></tt>" in the <tt>from</tt> and
|
||||
<tt>rcpt</tt> arguments to the <tt>send</tt> function. In headers, e-mail
|
||||
addresses can take whatever form you like. </p>
|
||||
|
||||
<p class="note">
|
||||
Big note: There is a good deal of misconception with the use of the
|
||||
destination address field headers, i.e., the '<tt>To</tt>', '<tt>Cc</tt>',
|
||||
and, more importantly, the '<tt>Bcc</tt>' headers. Do <em>not</em> add a
|
||||
'<tt>Bcc</tt>' header to your messages because it will probably do the
|
||||
exact opposite of what you expect.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Only recipients specified in the <tt>rcpt</tt> list will receive a copy of the
|
||||
message. Each recipient of an SMTP mail message receives a copy of the
|
||||
message body along with the headers, and nothing more. The headers
|
||||
<em>are</em> part of the message and should be produced by the
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
<tt>source</tt> function. The <tt>rcpt</tt> list is <em>not</em>
|
||||
part of the message and will not be sent to anyone.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<a href="http://www.ietf.org/rfc/rfc2822.txt">RFC 2822</a>
|
||||
has two <em>important and short</em> 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:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li> <tt>To</tt>: contains the address(es) of the primary recipient(s)
|
||||
of the message;</li>
|
||||
<li> <tt>Cc</tt>: (where the "Cc" means "Carbon Copy" in the sense of
|
||||
making a copy on a typewriter using carbon paper) contains the
|
||||
addresses of others who are to receive the message, though the
|
||||
content of the message may not be directed at them;</li>
|
||||
<li> <tt>Bcc</tt>: (where the "Bcc" means "Blind Carbon
|
||||
Copy") contains addresses of recipients of the message whose addresses are not
|
||||
to be revealed to other recipients of the message.</li>
|
||||
</ul>
|
||||
|
||||
<p class="note">
|
||||
The LuaSocket <tt>send</tt> function does not care or interpret the
|
||||
headers you send, but it gives you full control over what is sent and
|
||||
to whom it is sent:
|
||||
</p>
|
||||
<ul>
|
||||
<li> If someone is to receive the message, the e-mail address <em>has</em>
|
||||
to be in the recipient list. This is the only parameter that controls who
|
||||
gets a copy of the message;</li>
|
||||
<li> If there are multiple recipients, none of them will automatically
|
||||
know that someone else got that message. That is, the default behavior is
|
||||
similar to the <tt>Bcc</tt> field of popular e-mail clients;</li>
|
||||
<li> It is up to you to add the <tt>To</tt> header with the list of primary
|
||||
recipients so that other recipients can see it;</li>
|
||||
<li> It is also up to you to add the <tt>Cc</tt> header with the
|
||||
list of additional recipients so that everyone else sees it;</li>
|
||||
<li> Adding a header <tt>Bcc</tt> is nonsense, unless it is
|
||||
empty. Otherwise, everyone receiving the message will see it and that is
|
||||
exactly what you <em>don't</em> want to happen!</li>
|
||||
</ul>
|
||||
|
||||
<p class="note">
|
||||
I hope this clarifies the issue. Otherwise, please refer to
|
||||
<a href="http://www.ietf.org/rfc/rfc2821.txt">RFC 2821</a>
|
||||
and
|
||||
<a href="http://www.ietf.org/rfc/rfc2822.txt">RFC 2822</a>.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- load the smtp support
|
||||
local smtp = require("socket.smtp")
|
||||
|
||||
-- Connects to server "localhost" and sends a message to users
|
||||
-- "fulano@example.com", "beltrano@example.com",
|
||||
-- and "sicrano@example.com".
|
||||
-- Note that "fulano" is the primary recipient, "beltrano" receives a
|
||||
-- carbon copy and neither of them knows that "sicrano" received a blind
|
||||
-- carbon copy of the message.
|
||||
from = "<luasocket@example.com>"
|
||||
|
||||
rcpt = {
|
||||
"<fulano@example.com>",
|
||||
"<beltrano@example.com>",
|
||||
"<sicrano@example.com>"
|
||||
}
|
||||
|
||||
mesgt = {
|
||||
headers = {
|
||||
to = "Fulano da Silva <fulano@example.com>",
|
||||
cc = '"Beltrano F. Nunes" <beltrano@example.com>',
|
||||
subject = "My first message"
|
||||
},
|
||||
body = "I hope this works. If it does, I can send you another 1000 copies."
|
||||
}
|
||||
|
||||
r, e = smtp.send{
|
||||
from = from,
|
||||
rcpt = rcpt,
|
||||
source = smtp.message(mesgt)
|
||||
}
|
||||
</pre>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:25:51 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
481
src/deps/src/luasocket/docs/socket.html
vendored
481
src/deps/src/luasocket/docs/socket.html
vendored
|
|
@ -1,481 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: The core namespace">
|
||||
<meta name="keywords" content="Lua, LuaSocket, Socket, Network, Library, Support">
|
||||
<title>LuaSocket: The socket namespace</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="https://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- socket +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="socket">The socket namespace</h2>
|
||||
|
||||
<p>
|
||||
The <tt>socket</tt> namespace contains the core functionality of LuaSocket.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To obtain the <tt>socket</tt> namespace, run:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- loads the socket module
|
||||
local socket = require("socket")
|
||||
</pre>
|
||||
|
||||
<!-- headers.canonic ++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="headers.canonic">
|
||||
socket.headers.<b>canonic</b></p>
|
||||
|
||||
<p> The <tt>socket.headers.canonic</tt> table
|
||||
is used by the HTTP and SMTP modules to translate from
|
||||
lowercase field names back into their canonic
|
||||
capitalization. When a lowercase field name exists as a key
|
||||
in this table, the associated value is substituted in
|
||||
whenever the field name is sent out.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
You can obtain the <tt>headers</tt> namespace if case run-time
|
||||
modifications are required by running:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- loads the headers module
|
||||
local headers = require("headers")
|
||||
</pre>
|
||||
|
||||
|
||||
<!-- bind ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="bind">
|
||||
socket.<b>bind(</b>address, port [, backlog]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
This function is a shortcut that creates and returns a TCP server object
|
||||
bound to a local <tt>address</tt> and <tt>port</tt>, ready to
|
||||
accept client connections. Optionally,
|
||||
user can also specify the <tt>backlog</tt> argument to the
|
||||
<a href="tcp.html#listen"><tt>listen</tt></a> method (defaults to 32).
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The server object returned will have the option "<tt>reuseaddr</tt>"
|
||||
set to <tt><b>true</b></tt>.
|
||||
</p>
|
||||
|
||||
<!-- connect ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="connect">
|
||||
socket.<b>connect[46](</b>address, port [, locaddr] [, locport] [, family]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
This function is a shortcut that creates and returns a TCP client object
|
||||
connected to a remote <tt>address</tt> at a given <tt>port</tt>. Optionally,
|
||||
the user can also specify the local address and port to bind
|
||||
(<tt>locaddr</tt> and <tt>locport</tt>), or restrict the socket family
|
||||
to "<tt>inet</tt>" or "<tt>inet6</tt>".
|
||||
Without specifying <tt>family</tt> to <tt>connect</tt>, whether a tcp or tcp6
|
||||
connection is created depends on your system configuration. Two variations
|
||||
of connect are defined as simple helper functions that restrict the
|
||||
<tt>family</tt>, <tt>socket.connect4</tt> and <tt>socket.connect6</tt>.
|
||||
</p>
|
||||
|
||||
<!-- debug ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="debug">
|
||||
socket.<b>_DEBUG</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
This constant is set to <tt><b>true</b></tt> if the library was compiled
|
||||
with debug support.
|
||||
</p>
|
||||
|
||||
<!-- datagramsize +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="datagramsize">
|
||||
socket.<b>_DATAGRAMSIZE</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Default datagram size used by calls to
|
||||
<a href="udp.html#receive"><tt>receive</tt></a> and
|
||||
<a href="udp.html#receivefrom"><tt>receivefrom</tt></a>.
|
||||
(Unless changed in compile time, the value is 8192.)
|
||||
</p>
|
||||
|
||||
<!-- get time +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="gettime">
|
||||
socket.<b>gettime()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns the UNIX time in seconds. You should subtract the values returned by this function
|
||||
to get meaningful values.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
t = socket.gettime()
|
||||
-- do stuff
|
||||
print(socket.gettime() - t .. " seconds elapsed")
|
||||
</pre>
|
||||
|
||||
<!-- newtry +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="newtry">
|
||||
socket.<b>newtry(</b>finalizer<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns a <em>clean</em>
|
||||
<a href="#try"><tt>try</tt></a>
|
||||
function that allows for cleanup before the exception
|
||||
is raised.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Finalizer</tt> is a function that will be called before
|
||||
<tt>try</tt> throws the exception.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns your customized <tt>try</tt> function.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: This idea saved a <em>lot</em> of work with the
|
||||
implementation of protocols in LuaSocket:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
foo = socket.protect(function()
|
||||
-- connect somewhere
|
||||
local c = socket.try(socket.connect("somewhere", 42))
|
||||
-- create a try function that closes 'c' on error
|
||||
local try = socket.newtry(function() c:close() end)
|
||||
-- do everything reassured c will be closed
|
||||
try(c:send("hello there?\r\n"))
|
||||
local answer = try(c:receive())
|
||||
...
|
||||
try(c:send("good bye\r\n"))
|
||||
c:close()
|
||||
end)
|
||||
</pre>
|
||||
|
||||
|
||||
<!-- protect +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="protect">
|
||||
socket.<b>protect(</b>func<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Converts a function that throws exceptions into a safe function. This
|
||||
function only catches exceptions thrown by the <a href="#try"><tt>try</tt></a>
|
||||
and <a href="#newtry"><tt>newtry</tt></a> functions. It does not catch normal
|
||||
Lua errors.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Func</tt> is a function that calls
|
||||
<a href="#try"><tt>try</tt></a> (or <tt>assert</tt>, or <tt>error</tt>)
|
||||
to throw exceptions.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
Returns an equivalent function that instead of throwing exceptions in case of
|
||||
a failed <a href="#try"><tt>try</tt></a> call, returns <tt><b>nil</b></tt>
|
||||
followed by an error message.
|
||||
</p>
|
||||
|
||||
<!-- select +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="select">
|
||||
socket.<b>select(</b>recvt, sendt [, timeout]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Waits for a number of sockets to change status.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Recvt</tt> is an array with the sockets to test for characters
|
||||
available for reading. Sockets in the <tt>sendt</tt> array are watched to
|
||||
see if it is OK to immediately write on them. <tt>Timeout</tt> is the
|
||||
maximum amount of time (in seconds) to wait for a change in status. A
|
||||
<tt><b>nil</b></tt>, negative or omitted <tt>timeout</tt> value allows the
|
||||
function to block indefinitely. <tt>Recvt</tt> and <tt>sendt</tt> can also
|
||||
be empty tables or <tt><b>nil</b></tt>. Non-socket values (or values with
|
||||
non-numeric indices) in the arrays will be silently ignored.
|
||||
</p>
|
||||
|
||||
<p class="return"> The function returns a list with the sockets ready for
|
||||
reading, a list with the sockets ready for writing and an error message.
|
||||
The error message is "<tt>timeout</tt>" if a timeout
|
||||
condition was met, "<tt>select failed</tt>" if the call
|
||||
to <tt>select</tt> failed, and
|
||||
<tt><b>nil</b></tt> otherwise. The returned tables are
|
||||
doubly keyed both by integers and also by the sockets
|
||||
themselves, to simplify the test if a specific socket has
|
||||
changed status.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<b>Note:</b> <tt>select</tt> can monitor a limited number
|
||||
of sockets, as defined by the constant <a href="#setsize">
|
||||
<tt>socket._SETSIZE</tt></a>. This
|
||||
number may be as high as 1024 or as low as 64 by default,
|
||||
depending on the system. It is usually possible to change this
|
||||
at compile time. Invoking <tt>select</tt> with a larger
|
||||
number of sockets will raise an error.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<b>Important note</b>: a known bug in WinSock causes <tt>select</tt> to fail
|
||||
on non-blocking TCP sockets. The function may return a socket as
|
||||
writable even though the socket is <em>not</em> ready for sending.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<b>Another important note</b>: calling select with a server socket in the receive parameter before a call to accept does <em>not</em> guarantee
|
||||
<a href="tcp.html#accept"><tt>accept</tt></a> will return immediately.
|
||||
Use the <a href="tcp.html#settimeout"><tt>settimeout</tt></a>
|
||||
method or <tt>accept</tt> might block forever.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<b>Yet another note</b>: If you close a socket and pass
|
||||
it to <tt>select</tt>, it will be ignored.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<b>Using select with non-socket objects</b>: Any object that implements <tt>getfd</tt> and <tt>dirty</tt> can be used with <tt>select</tt>, allowing objects from other libraries to be used within a <tt>socket.select</tt> driven loop.
|
||||
</p>
|
||||
|
||||
<!-- setsize ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="setsize">
|
||||
socket.<b>_SETSIZE</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
The maximum number of sockets that the <a
|
||||
href="#select"><tt>select</tt></a> function can handle.
|
||||
</p>
|
||||
|
||||
|
||||
<!-- sink ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sink">
|
||||
socket.<b>sink(</b>mode, socket<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates an
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
sink from a stream socket object.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Mode</tt> defines the behavior of the sink. The following
|
||||
options are available:
|
||||
</p>
|
||||
<ul>
|
||||
<li> <tt>"http-chunked"</tt>: sends data through socket after applying the
|
||||
<em>chunked transfer coding</em>, closing the socket when done;</li>
|
||||
<li> <tt>"close-when-done"</tt>: sends all received data through the
|
||||
socket, closing the socket when done;</li>
|
||||
<li> <tt>"keep-open"</tt>: sends all received data through the
|
||||
socket, leaving it open when done.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<tt>Socket</tt> is the stream socket object used to send the data.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns a sink with the appropriate behavior.
|
||||
</p>
|
||||
|
||||
<!-- skip ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="skip">
|
||||
socket.<b>skip(</b>d [, ret<sub>1</sub>, ret<sub>2</sub> ... ret<sub>N</sub>]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Drops a number of arguments and returns the remaining.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>D</tt> is the number of arguments to drop. <tt>Ret<sub>1</sub></tt> to
|
||||
<tt>ret<sub>N</sub></tt> are the arguments.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns <tt>ret<sub>d+1</sub></tt> to <tt>ret<sub>N</sub></tt>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: This function is useful to avoid creation of dummy variables:
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- get the status code and separator from SMTP server reply
|
||||
local code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)"))
|
||||
</pre>
|
||||
|
||||
<!-- sleep ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sleep">
|
||||
socket.<b>sleep(</b>time<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Freezes the program execution during a given amount of time.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Time</tt> is the number of seconds to sleep for. If
|
||||
<tt>time</tt> is negative, the function returns immediately.
|
||||
</p>
|
||||
|
||||
<!-- source +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="source">
|
||||
socket.<b>source(</b>mode, socket [, length]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates an
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
source from a stream socket object.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Mode</tt> defines the behavior of the source. The following
|
||||
options are available:
|
||||
</p>
|
||||
<ul>
|
||||
<li> <tt>"http-chunked"</tt>: receives data from socket and removes the
|
||||
<em>chunked transfer coding</em> before returning the data;</li>
|
||||
<li> <tt>"by-length"</tt>: receives a fixed number of bytes from the
|
||||
socket. This mode requires the extra argument <tt>length</tt>;</li>
|
||||
<li> <tt>"until-closed"</tt>: receives data from a socket until the other
|
||||
side closes the connection.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<tt>Socket</tt> is the stream socket object used to receive the data.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns a source with the appropriate behavior.
|
||||
</p>
|
||||
|
||||
<!-- socketinvalid ++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="socketinvalid">
|
||||
socket.<b>_SOCKETINVALID</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
The OS value for an invalid socket. This can be used with <a href="tcp.html#getfd">
|
||||
<tt>tcp:getfd</tt></a> and <a href="tcp.html#setfd"><tt>tcp:setfd</tt></a> methods.
|
||||
</p>
|
||||
|
||||
<!-- try ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="try">
|
||||
socket.<b>try(</b>ret<sub>1</sub> [, ret<sub>2</sub> ... ret<sub>N</sub>]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Throws an exception in case <tt>ret<sub>1</sub></tt> is falsy, using
|
||||
<tt>ret<sub>2</sub></tt> as the error message. The exception is supposed to be caught
|
||||
by a <a href="#protect"><tt>protect</tt></a>ed function only.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Ret<sub>1</sub></tt> to <tt>ret<sub>N</sub></tt> can be arbitrary
|
||||
arguments, but are usually the return values of a function call
|
||||
nested with <tt>try</tt>.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The function returns <tt>ret</tt><sub>1</sub> to <tt>ret</tt><sub>N</sub> if
|
||||
<tt>ret</tt><sub>1</sub> is not <tt><b>nil</b></tt> or <tt><b>false</b></tt>.
|
||||
Otherwise, it calls <tt>error</tt> passing <tt>ret</tt><sub>2</sub> wrapped
|
||||
in a table with metatable used by <a href="#protect"><tt>protect</tt></a> to
|
||||
distinguish exceptions from runtime errors.
|
||||
</p>
|
||||
|
||||
<pre class="example">
|
||||
-- connects or throws an exception with the appropriate error message
|
||||
c = socket.try(socket.connect("localhost", 80))
|
||||
</pre>
|
||||
|
||||
<!-- version ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="version">
|
||||
socket.<b>_VERSION</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
This constant has a string describing the current LuaSocket version.
|
||||
</p>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:25:54 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
738
src/deps/src/luasocket/docs/tcp.html
vendored
738
src/deps/src/luasocket/docs/tcp.html
vendored
|
|
@ -1,738 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: The TCP/IP support">
|
||||
<meta name="keywords" content="Lua, LuaSocket, Socket, TCP, Library, Network, Support">
|
||||
<title>LuaSocket: TCP/IP support</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- tcp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="tcp">TCP</h2>
|
||||
|
||||
<!-- accept +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="accept">
|
||||
server:<b>accept()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Waits for a remote connection on the server
|
||||
object and returns a client object representing that connection.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
If a connection is successfully initiated, a client object is returned.
|
||||
If a timeout condition is met, the method returns <b><tt>nil</tt></b>
|
||||
followed by the error string '<tt>timeout</tt>'. Other errors are
|
||||
reported by <b><tt>nil</tt></b> followed by a message describing the error.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: calling <a href="socket.html#select"><tt>socket.select</tt></a>
|
||||
with a server object in
|
||||
the <tt>recvt</tt> parameter before a call to <tt>accept</tt> does
|
||||
<em>not</em> guarantee <tt>accept</tt> will return immediately. Use the <a
|
||||
href="#settimeout"><tt>settimeout</tt></a> method or <tt>accept</tt>
|
||||
might block until <em>another</em> client shows up.
|
||||
</p>
|
||||
|
||||
<!-- bind +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="bind">
|
||||
master:<b>bind(</b>address, port<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Binds a master object to <tt>address</tt> and <tt>port</tt> on the
|
||||
local host.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Address</tt> can be an IP address or a host name.
|
||||
<tt>Port</tt> must be an integer number in the range [0..64K).
|
||||
If <tt>address</tt>
|
||||
is '<tt>*</tt>', the system binds to all local interfaces
|
||||
using the <tt>INADDR_ANY</tt> constant or
|
||||
<tt>IN6ADDR_ANY_INIT</tt>, according to the family.
|
||||
If <tt>port</tt> is 0, the system automatically
|
||||
chooses an ephemeral port.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, the method returns 1. In case of error, the
|
||||
method returns <b><tt>nil</tt></b> followed by an error message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The function <a href="socket.html#bind"><tt>socket.bind</tt></a>
|
||||
is available and is a shortcut for the creation of server sockets.
|
||||
</p>
|
||||
|
||||
<!-- close ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="close">
|
||||
master:<b>close()</b><br>
|
||||
client:<b>close()</b><br>
|
||||
server:<b>close()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Closes a TCP object. The internal socket used by the object is closed
|
||||
and the local address to which the object was
|
||||
bound is made available to other applications. No further operations
|
||||
(except for further calls to the <tt>close</tt> method) are allowed on
|
||||
a closed socket.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: It is important to close all used sockets once they are not
|
||||
needed, since, in many systems, each socket uses a file descriptor,
|
||||
which are limited system resources. Garbage-collected objects are
|
||||
automatically closed before destruction, though.
|
||||
</p>
|
||||
|
||||
<!-- connect ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="connect">
|
||||
master:<b>connect(</b>address, port<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Attempts to connect a master object to a remote host, transforming it into a
|
||||
client object.
|
||||
Client objects support methods
|
||||
<a href="#send"><tt>send</tt></a>,
|
||||
<a href="#receive"><tt>receive</tt></a>,
|
||||
<a href="#getsockname"><tt>getsockname</tt></a>,
|
||||
<a href="#getpeername"><tt>getpeername</tt></a>,
|
||||
<a href="#settimeout"><tt>settimeout</tt></a>,
|
||||
and <a href="#close"><tt>close</tt></a>.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Address</tt> can be an IP address or a host name.
|
||||
<tt>Port</tt> must be an integer number in the range [1..64K).
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
In case of error, the method returns <b><tt>nil</tt></b> followed by a string
|
||||
describing the error. In case of success, the method returns 1.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The function <a href="socket.html#connect"><tt>socket.connect</tt></a>
|
||||
is available and is a shortcut for the creation of client sockets.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: Starting with LuaSocket 2.0,
|
||||
the <a href="#settimeout"><tt>settimeout</tt></a>
|
||||
method affects the behavior of <tt>connect</tt>, causing it to return
|
||||
with an error in case of a timeout. If that happens, you can still call <a
|
||||
href="socket.html#select"><tt>socket.select</tt></a> with the socket in the
|
||||
<tt>sendt</tt> table. The socket will be writable when the connection is
|
||||
established.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: Starting with LuaSocket 3.0, the host name resolution
|
||||
depends on whether the socket was created by
|
||||
<a href="#socket.tcp"><tt>socket.tcp</tt></a>,
|
||||
<a href="#socket.tcp4"><tt>socket.tcp4</tt></a> or
|
||||
<a href="#socket.tcp6"><tt>socket.tcp6</tt></a>. Addresses from
|
||||
the appropriate family (or both) are tried in the order
|
||||
returned by the resolver until the
|
||||
first success or until the last failure. If the timeout was
|
||||
set to zero, only the first address is tried.
|
||||
</p>
|
||||
|
||||
<!-- dirty +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="dirty">
|
||||
master:<b>dirty()</b><br>
|
||||
client:<b>dirty()</b><br>
|
||||
server:<b>dirty()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Check the read buffer status.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
Returns <tt>true</tt> if there is any data in the read buffer, <tt>false</tt> otherwise.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: <b>This is an internal method, use at your own risk.</b>
|
||||
</p>
|
||||
|
||||
|
||||
<!-- getfd +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getfd">
|
||||
master:<b>getfd()</b><br>
|
||||
client:<b>getfd()</b><br>
|
||||
server:<b>getfd()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns the underling socket descriptor or handle associated to the object.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The descriptor or handle. In case the object has been closed, the return value
|
||||
will be -1. For an invalid socket it will be <a href="socket.html#socketinvalid">
|
||||
<tt>_SOCKETINVALID</tt></a>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: <b>This is an internal method. Unlikely to be
|
||||
portable. Use at your own risk. </b>
|
||||
</p>
|
||||
|
||||
|
||||
<!-- getoption ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getoption">
|
||||
client:<b>getoption(option)</b><br>
|
||||
server:<b>getoption(option)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Gets options for the TCP object.
|
||||
See <a href="#setoption"><tt>setoption</tt></a> for description of the
|
||||
option names and values.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Option</tt> is a string with the option name.</p>
|
||||
<ul>
|
||||
<li> '<tt>keepalive</tt>'</li>
|
||||
<li> '<tt>linger</tt>'</li>
|
||||
<li> '<tt>reuseaddr</tt>'</li>
|
||||
<li> '<tt>tcp-nodelay</tt>'</li>
|
||||
</ul>
|
||||
|
||||
<p class="return">
|
||||
The method returns the option <tt>value</tt> in case of success, or
|
||||
<b><tt>nil</tt></b> followed by an error message otherwise.
|
||||
</p>
|
||||
|
||||
|
||||
<!-- getpeername ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getpeername">
|
||||
client:<b>getpeername()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns information about the remote side of a connected client object.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
Returns a string with the IP address of the peer, the
|
||||
port number that peer is using for the connection,
|
||||
and a string with the family ("<tt>inet</tt>" or "<tt>inet6</tt>").
|
||||
In case of error, the method returns <b><tt>nil</tt></b>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: It makes no sense to call this method on server objects.
|
||||
</p>
|
||||
|
||||
<!-- getsockname ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getsockname">
|
||||
master:<b>getsockname()</b><br>
|
||||
client:<b>getsockname()</b><br>
|
||||
server:<b>getsockname()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns the local address information associated to the object.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The method returns a string with local IP address, a number with
|
||||
the local port,
|
||||
and a string with the family ("<tt>inet</tt>" or "<tt>inet6</tt>").
|
||||
In case of error, the method returns <b><tt>nil</tt></b>.
|
||||
</p>
|
||||
|
||||
<!-- getstats +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getstats">
|
||||
master:<b>getstats()</b><br>
|
||||
client:<b>getstats()</b><br>
|
||||
server:<b>getstats()</b><br>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns accounting information on the socket, useful for throttling
|
||||
of bandwidth.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The method returns the number of bytes received, the number of bytes sent,
|
||||
and the age of the socket object in seconds.
|
||||
</p>
|
||||
|
||||
<!-- gettimeout +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="gettimeout">
|
||||
master:<b>gettimeout()</b><br>
|
||||
client:<b>gettimeout()</b><br>
|
||||
server:<b>gettimeout()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns the current block timeout followed by the curent
|
||||
total timeout.
|
||||
</p>
|
||||
|
||||
|
||||
<!-- listen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="listen">
|
||||
master:<b>listen(</b>backlog<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Specifies the socket is willing to receive connections, transforming the
|
||||
object into a server object. Server objects support the
|
||||
<a href="#accept"><tt>accept</tt></a>,
|
||||
<a href="#getsockname"><tt>getsockname</tt></a>,
|
||||
<a href="#setoption"><tt>setoption</tt></a>,
|
||||
<a href="#settimeout"><tt>settimeout</tt></a>,
|
||||
and <a href="#close"><tt>close</tt></a> methods.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
The parameter <tt>backlog</tt> specifies the number of client
|
||||
connections that can
|
||||
be queued waiting for service. If the queue is full and another client
|
||||
attempts connection, the connection is refused.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, the method returns 1. In case of error, the
|
||||
method returns <b><tt>nil</tt></b> followed by an error message.
|
||||
</p>
|
||||
|
||||
<!-- receive ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="receive">
|
||||
client:<b>receive(</b>[pattern [, prefix]]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Reads data from a client object, according to the specified <em>read
|
||||
pattern</em>. Patterns follow the Lua file I/O format, and the difference in performance between all patterns is negligible.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Pattern</tt> can be any of the following:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li> '<tt>*a</tt>': reads from the socket until the connection is
|
||||
closed. No end-of-line translation is performed;</li>
|
||||
<li> '<tt>*l</tt>': reads a line of text from the socket. The line is
|
||||
terminated by a LF character (ASCII 10), optionally preceded by a
|
||||
CR character (ASCII 13). The CR and LF characters are not included in
|
||||
the returned line. In fact, <em>all</em> CR characters are
|
||||
ignored by the pattern. This is the default pattern;</li>
|
||||
<li> <tt>number</tt>: causes the method to read a specified <tt>number</tt>
|
||||
of bytes from the socket.</li>
|
||||
</ul>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Prefix</tt> is an optional string to be concatenated to the beginning
|
||||
of any received data before return.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
If successful, the method returns the received pattern. In case of error,
|
||||
the method returns <tt><b>nil</b></tt> followed by an error
|
||||
message, followed by a (possibly empty) string containing
|
||||
the partial that was received. The error message can be
|
||||
the string '<tt>closed</tt>' in case the connection was
|
||||
closed before the transmission was completed or the string
|
||||
'<tt>timeout</tt>' in case there was a timeout during the operation.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
<b>Important note</b>: This function was changed <em>severely</em>. It used
|
||||
to support multiple patterns (but I have never seen this feature used) and
|
||||
now it doesn't anymore. Partial results used to be returned in the same
|
||||
way as successful results. This last feature violated the idea that all
|
||||
functions should return <tt><b>nil</b></tt> on error. Thus it was changed
|
||||
too.
|
||||
</p>
|
||||
|
||||
<!-- send +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="send">
|
||||
client:<b>send(</b>data [, i [, j]]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Sends <tt>data</tt> through client object.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Data</tt> is the string to be sent. The optional arguments
|
||||
<tt>i</tt> and <tt>j</tt> work exactly like the standard
|
||||
<tt>string.sub</tt> Lua function to allow the selection of a
|
||||
substring to be sent.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
If successful, the method returns the index of the last byte
|
||||
within <tt>[i, j]</tt> that has been sent. Notice that, if
|
||||
<tt>i</tt> is 1 or absent, this is effectively the total
|
||||
number of bytes sent. In case of error, the method returns
|
||||
<b><tt>nil</tt></b>, followed by an error message, followed
|
||||
by the index of the last byte within <tt>[i, j]</tt> that
|
||||
has been sent. You might want to try again from the byte
|
||||
following that. The error message can be '<tt>closed</tt>'
|
||||
in case the connection was closed before the transmission
|
||||
was completed or the string '<tt>timeout</tt>' in case
|
||||
there was a timeout during the operation.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: Output is <em>not</em> buffered. For small strings,
|
||||
it is always better to concatenate them in Lua
|
||||
(with the '<tt>..</tt>' operator) and send the result in one call
|
||||
instead of calling the method several times.
|
||||
</p>
|
||||
|
||||
<!-- setoption ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="setoption">
|
||||
client:<b>setoption(</b>option [, value]<b>)</b><br>
|
||||
server:<b>setoption(</b>option [, value]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Sets options for the TCP object. Options are only needed by low-level or
|
||||
time-critical applications. You should only modify an option if you
|
||||
are sure you need it.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Option</tt> is a string with the option name, and <tt>value</tt>
|
||||
depends on the option being set:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li> '<tt>keepalive</tt>': Setting this option to <tt>true</tt> enables
|
||||
the periodic transmission of messages on a connected socket. Should the
|
||||
connected party fail to respond to these messages, the connection is
|
||||
considered broken and processes using the socket are notified;</li>
|
||||
|
||||
<li> '<tt>linger</tt>': Controls the action taken when unsent data are
|
||||
queued on a socket and a close is performed. The value is a table with a
|
||||
boolean entry '<tt>on</tt>' and a numeric entry for the time interval
|
||||
'<tt>timeout</tt>' in seconds. If the '<tt>on</tt>' field is set to
|
||||
<tt>true</tt>, the system will block the process on the close attempt until
|
||||
it is able to transmit the data or until '<tt>timeout</tt>' has passed. If
|
||||
'<tt>on</tt>' is <tt>false</tt> and a close is issued, the system will
|
||||
process the close in a manner that allows the process to continue as
|
||||
quickly as possible. I do not advise you to set this to anything other than
|
||||
zero;</li>
|
||||
|
||||
<li> '<tt>reuseaddr</tt>': Setting this option indicates that the rules
|
||||
used in validating addresses supplied in a call to
|
||||
<a href="#bind"><tt>bind</tt></a> should allow reuse of local addresses;</li>
|
||||
|
||||
<li> '<tt>tcp-nodelay</tt>': Setting this option to <tt>true</tt>
|
||||
disables the Nagle's algorithm for the connection;</li>
|
||||
|
||||
<li> '<tt>tcp-keepidle</tt>': value in seconds for <tt>TCP_KEEPIDLE</tt> Linux only!!</li>
|
||||
|
||||
<li> '<tt>tcp-keepcnt</tt>': value for <tt>TCP_KEEPCNT</tt> Linux only!!</li>
|
||||
|
||||
<li> '<tt>tcp-keepintvl</tt>': value for <tt>TCP_KEEPINTVL</tt> Linux only!!</li>
|
||||
|
||||
<li> '<tt>tcp-defer-accept</tt>': value for <tt>TCP_DEFER_ACCEPT</tt> Linux only!!</li>
|
||||
|
||||
<li> '<tt>tcp-fastopen</tt>': value for <tt>TCP_FASTOPEN</tt> Linux only!!</li>
|
||||
|
||||
<li> '<tt>tcp-fastopen-connect</tt>': value for <tt>TCP_FASTOPEN_CONNECT</tt> Linux only!!</li>
|
||||
|
||||
<li> '<tt>ipv6-v6only</tt>':
|
||||
Setting this option to <tt>true</tt> restricts an <tt>inet6</tt> socket to
|
||||
sending and receiving only IPv6 packets.</li>
|
||||
</ul>
|
||||
|
||||
<p class="return">
|
||||
The method returns 1 in case of success, or <b><tt>nil</tt></b>
|
||||
followed by an error message otherwise.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The descriptions above come from the man pages.
|
||||
</p>
|
||||
|
||||
<!-- setstats +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="setstats">
|
||||
master:<b>setstats(</b>received, sent, age<b>)</b><br>
|
||||
client:<b>setstats(</b>received, sent, age<b>)</b><br>
|
||||
server:<b>setstats(</b>received, sent, age<b>)</b><br>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Resets accounting information on the socket, useful for throttling
|
||||
of bandwidth.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Received</tt> is a number with the new number of bytes received.
|
||||
<tt>Sent</tt> is a number with the new number of bytes sent.
|
||||
<tt>Age</tt> is the new age in seconds.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The method returns 1 in case of success and <tt><b>nil</b></tt> otherwise.
|
||||
</p>
|
||||
|
||||
<!-- settimeout +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="settimeout">
|
||||
master:<b>settimeout(</b>value [, mode]<b>)</b><br>
|
||||
client:<b>settimeout(</b>value [, mode]<b>)</b><br>
|
||||
server:<b>settimeout(</b>value [, mode]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Changes the timeout values for the object. By default,
|
||||
all I/O operations are blocking. That is, any call to the methods
|
||||
<a href="#send"><tt>send</tt></a>,
|
||||
<a href="#receive"><tt>receive</tt></a>, and
|
||||
<a href="#accept"><tt>accept</tt></a>
|
||||
will block indefinitely, until the operation completes. The
|
||||
<tt>settimeout</tt> method defines a limit on the amount of time the
|
||||
I/O methods can block. When a timeout is set and the specified amount of
|
||||
time has elapsed, the affected methods give up and fail with an error code.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
The amount of time to wait is specified as the
|
||||
<tt>value</tt> parameter, in seconds. There are two timeout modes and
|
||||
both can be used together for fine tuning:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li> '<tt>b</tt>': <em>block</em> timeout. Specifies the upper limit on
|
||||
the amount of time LuaSocket can be blocked by the operating system
|
||||
while waiting for completion of any single I/O operation. This is the
|
||||
default mode;</li>
|
||||
|
||||
<li> '<tt>t</tt>': <em>total</em> timeout. Specifies the upper limit on
|
||||
the amount of time LuaSocket can block a Lua script before returning from
|
||||
a call.</li>
|
||||
</ul>
|
||||
|
||||
<p class="parameters">
|
||||
The <b><tt>nil</tt></b> timeout <tt>value</tt> allows operations to block
|
||||
indefinitely. Negative timeout values have the same effect.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: although timeout values have millisecond precision in LuaSocket,
|
||||
large blocks can cause I/O functions not to respect timeout values due
|
||||
to the time the library takes to transfer blocks to and from the OS
|
||||
and to and from the Lua interpreter. Also, function that accept host names
|
||||
and perform automatic name resolution might be blocked by the resolver for
|
||||
longer than the specified timeout value.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The old <tt>timeout</tt> method is deprecated. The name has been
|
||||
changed for sake of uniformity, since all other method names already
|
||||
contained verbs making their imperative nature obvious.
|
||||
</p>
|
||||
|
||||
<!-- shutdown +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="shutdown">
|
||||
client:<b>shutdown(</b>mode<b>)</b><br>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Shuts down part of a full-duplex connection.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
Mode tells which way of the connection should be shut down and can
|
||||
take the value:
|
||||
<ul>
|
||||
<li>"<tt>both</tt>": disallow further sends and receives on the object.
|
||||
This is the default mode;</li>
|
||||
<li>"<tt>send</tt>": disallow further sends on the object;</li>
|
||||
<li>"<tt>receive</tt>": disallow further receives on the object.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
This function returns 1.
|
||||
</p>
|
||||
|
||||
<!-- setfd +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="setfd">
|
||||
master:<b>setfd(</b>fd<b>)</b><br>
|
||||
client:<b>setfd(</b>fd<b>)</b><br>
|
||||
server:<b>setfd(</b>fd<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Sets the underling socket descriptor or handle associated to the object. The current one
|
||||
is simply replaced, not closed, and no other change to the object state is made.
|
||||
To set it as invalid use <a href="socket.html#socketinvalid"><tt>_SOCKETINVALID</tt></a>.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
No return value.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: <b>This is an internal method. Unlikely to be
|
||||
portable. Use at your own risk. </b>
|
||||
</p>
|
||||
|
||||
<!-- socket.tcp +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="socket.tcp">
|
||||
socket.<b>tcp()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns an TCP master object. A master object can
|
||||
be transformed into a server object with the method
|
||||
<a href="#listen"><tt>listen</tt></a> (after a call to <a
|
||||
href="#bind"><tt>bind</tt></a>) or into a client object with
|
||||
the method <a href="#connect"><tt>connect</tt></a>. The only other
|
||||
method supported by a master object is the
|
||||
<a href="#close"><tt>close</tt></a> method.</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, a new master object is returned. In case of error,
|
||||
<b><tt>nil</tt></b> is returned, followed by an error message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The choice between IPv4 and IPv6 happens during a call to
|
||||
<a href="#bind"><tt>bind</tt></a> or <a
|
||||
href="#bind"><tt>connect</tt></a>, depending on the address
|
||||
family obtained from the resolver.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: Before the choice between IPv4 and IPv6 happens,
|
||||
the internal socket object is invalid and therefore <a
|
||||
href="#setoption"><tt>setoption</tt></a> will fail.
|
||||
</p>
|
||||
|
||||
<!-- socket.tcp +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="socket.tcp4">
|
||||
socket.<b>tcp4()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns an IPv4 TCP master object. A master object can
|
||||
be transformed into a server object with the method
|
||||
<a href="#listen"><tt>listen</tt></a> (after a call to <a
|
||||
href="#bind"><tt>bind</tt></a>) or into a client object with
|
||||
the method <a href="#connect"><tt>connect</tt></a>. The only other
|
||||
method supported by a master object is the
|
||||
<a href="#close"><tt>close</tt></a> method.</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, a new master object is returned. In case of error,
|
||||
<b><tt>nil</tt></b> is returned, followed by an error message.
|
||||
</p>
|
||||
|
||||
<!-- socket.tcp6 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="socket.tcp6">
|
||||
socket.<b>tcp6()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns an IPv6 TCP master object. A master object can
|
||||
be transformed into a server object with the method
|
||||
<a href="#listen"><tt>listen</tt></a> (after a call to <a
|
||||
href="#bind"><tt>bind</tt></a>) or into a client object with
|
||||
the method <a href="#connect"><tt>connect</tt></a>. The only other
|
||||
method supported by a master object is the
|
||||
<a href="#close"><tt>close</tt></a> method.</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, a new master object is returned. In case of error,
|
||||
<b><tt>nil</tt></b> is returned, followed by an error message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The TCP object returned will have the option
|
||||
"<tt>ipv6-v6only</tt>" set to <tt><b>true</b></tt>.
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:25:57 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
596
src/deps/src/luasocket/docs/udp.html
vendored
596
src/deps/src/luasocket/docs/udp.html
vendored
|
|
@ -1,596 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: The UDP support">
|
||||
<meta name="keywords" content="Lua, LuaSocket, Socket, UDP, Library, Network, Support">
|
||||
<title>LuaSocket: UDP support</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="header">
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align="center"><a href="http://www.lua.org">
|
||||
<img width="128" height="128" border="0" alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align="center" valign="top">Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- udp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="udp">UDP</h2>
|
||||
|
||||
<!-- close +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="close">
|
||||
connected:<b>close()</b><br>
|
||||
unconnected:<b>close()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Closes a UDP object. The internal socket
|
||||
used by the object is closed and the local address to which the
|
||||
object was bound is made available to other applications. No
|
||||
further operations (except for further calls to the <tt>close</tt>
|
||||
method) are allowed on a closed socket.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: It is important to close all used sockets
|
||||
once they are not needed, since, in many systems, each socket uses
|
||||
a file descriptor, which are limited system resources.
|
||||
Garbage-collected objects are automatically closed before
|
||||
destruction, though.
|
||||
</p>
|
||||
|
||||
<!-- getoption +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getoption">
|
||||
connected:<b>getoption()</b><br>
|
||||
unconnected:<b>getoption()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Gets an option value from the UDP object.
|
||||
See <a href="#setoption"><tt>setoption</tt></a> for
|
||||
description of the option names and values.
|
||||
</p>
|
||||
|
||||
<p class="parameters"><tt>Option</tt> is a string with the option name.
|
||||
<ul>
|
||||
<li> '<tt>dontroute</tt>'</li>
|
||||
<li> '<tt>broadcast</tt>'</li>
|
||||
<li> '<tt>reuseaddr</tt>'</li>
|
||||
<li> '<tt>reuseport</tt>'</li>
|
||||
<li> '<tt>ip-multicast-loop</tt>'</li>
|
||||
<li> '<tt>ipv6-v6only</tt>'</li>
|
||||
<li> '<tt>ip-multicast-if</tt>'</li>
|
||||
<li> '<tt>ip-multicast-ttl</tt>'</li>
|
||||
<li> '<tt>ip-add-membership</tt>'</li>
|
||||
<li> '<tt>ip-drop-membership</tt>'</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
The method returns the option <tt>value</tt> in case of
|
||||
success, or
|
||||
<b><tt>nil</tt></b> followed by an error message otherwise.
|
||||
</p>
|
||||
|
||||
<!-- getpeername +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getpeername">
|
||||
connected:<b>getpeername()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Retrieves information about the peer
|
||||
associated with a connected UDP object.
|
||||
</p>
|
||||
|
||||
|
||||
<p class="return">
|
||||
Returns a string with the IP address of the peer, the
|
||||
port number that peer is using for the connection,
|
||||
and a string with the family ("<tt>inet</tt>" or "<tt>inet6</tt>").
|
||||
In case of error, the method returns <b><tt>nil</tt></b>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: It makes no sense to call this method on unconnected objects.
|
||||
</p>
|
||||
|
||||
<!-- getsockname +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="getsockname">
|
||||
connected:<b>getsockname()</b><br>
|
||||
unconnected:<b>getsockname()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns the local address information associated to the object.
|
||||
</p>
|
||||
|
||||
|
||||
<p class="return">
|
||||
The method returns a string with local IP address, a number with
|
||||
the local port,
|
||||
and a string with the family ("<tt>inet</tt>" or "<tt>inet6</tt>").
|
||||
In case of error, the method returns <b><tt>nil</tt></b>.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: UDP sockets are not bound to any address
|
||||
until the <a href="#setsockname"><tt>setsockname</tt></a> or the
|
||||
<a href="#sendto"><tt>sendto</tt></a> method is called for the
|
||||
first time (in which case it is bound to an ephemeral port and the
|
||||
wild-card address).
|
||||
</p>
|
||||
|
||||
<!-- gettimeout +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="gettimeout">
|
||||
connected:<b>settimeout(</b>value<b>)</b><br>
|
||||
unconnected:<b>settimeout(</b>value<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Returns the current timeout value.
|
||||
</p>
|
||||
|
||||
|
||||
<!-- receive +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="receive">
|
||||
connected:<b>receive(</b>[size]<b>)</b><br>
|
||||
unconnected:<b>receive(</b>[size]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Receives a datagram from the UDP object. If
|
||||
the UDP object is connected, only datagrams coming from the peer
|
||||
are accepted. Otherwise, the returned datagram can come from any
|
||||
host.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
The optional <tt>size</tt> parameter
|
||||
specifies the maximum size of the datagram to be retrieved. If
|
||||
there are more than <tt>size</tt> bytes available in the datagram,
|
||||
the excess bytes are discarded. If there are less then
|
||||
<tt>size</tt> bytes available in the current datagram, the
|
||||
available bytes are returned.
|
||||
If <tt>size</tt> is omitted, the
|
||||
compile-time constant <a href="socket.html#datagramsize">
|
||||
<tt>socket._DATAGRAMSIZE</tt></a> is used
|
||||
(it defaults to 8192 bytes). Larger sizes will cause a
|
||||
temporary buffer to be allocated for the operation.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, the method returns the
|
||||
received datagram. In case of timeout, the method returns
|
||||
<b><tt>nil</tt></b> followed by the string '<tt>timeout</tt>'.
|
||||
</p>
|
||||
|
||||
<!-- receivefrom +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="receivefrom">
|
||||
unconnected:<b>receivefrom(</b>[size]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Works exactly as the <a href="#receive"><tt>receive</tt></a>
|
||||
method, except it returns the IP
|
||||
address and port as extra return values (and is therefore slightly less
|
||||
efficient).
|
||||
</p>
|
||||
|
||||
<!-- send ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="send">
|
||||
connected:<b>send(</b>datagram<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Sends a datagram to the UDP peer of a connected object.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Datagram</tt> is a string with the datagram contents.
|
||||
The maximum datagram size for UDP is 64K minus IP layer overhead.
|
||||
However datagrams larger than the link layer packet size will be
|
||||
fragmented, which may deteriorate performance and/or reliability.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
If successful, the method returns 1. In case of
|
||||
error, the method returns <b><tt>nil</tt></b> followed by an error message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: In UDP, the <tt>send</tt> method never blocks
|
||||
and the only way it can fail is if the underlying transport layer
|
||||
refuses to send a message to the specified address (i.e. no
|
||||
interface accepts the address).
|
||||
</p>
|
||||
|
||||
<!-- sendto ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="sendto">
|
||||
unconnected:<b>sendto(</b>datagram, ip, port<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Sends a datagram to the specified IP address and port number.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Datagram</tt> is a string with the
|
||||
datagram contents.
|
||||
The maximum datagram size for UDP is 64K minus IP layer overhead.
|
||||
However datagrams larger than the link layer packet size will be
|
||||
fragmented, which may deteriorate performance and/or reliability.
|
||||
<tt>Ip</tt> is the IP address of the recipient.
|
||||
Host names are <em>not</em> allowed for performance reasons.
|
||||
|
||||
<tt>Port</tt> is the port number at the recipient.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
If successful, the method returns 1. In case of
|
||||
error, the method returns <b><tt>nil</tt></b> followed by an error message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: In UDP, the <tt>send</tt> method never blocks
|
||||
and the only way it can fail is if the underlying transport layer
|
||||
refuses to send a message to the specified address (i.e. no
|
||||
interface accepts the address).
|
||||
</p>
|
||||
|
||||
<!-- setoption +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="setoption">
|
||||
connected:<b>setoption(</b>option [, value]<b>)</b><br>
|
||||
unconnected:<b>setoption(</b>option [, value]<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Sets options for the UDP object. Options are
|
||||
only needed by low-level or time-critical applications. You should
|
||||
only modify an option if you are sure you need it.</p>
|
||||
<p class="parameters"><tt>Option</tt> is a string with the option
|
||||
name, and <tt>value</tt> depends on the option being set:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li> '<tt>dontroute</tt>': Indicates that outgoing
|
||||
messages should bypass the standard routing facilities.
|
||||
Receives a boolean value;</li>
|
||||
<li> '<tt>broadcast</tt>': Requests permission to send
|
||||
broadcast datagrams on the socket.
|
||||
Receives a boolean value;</li>
|
||||
<li> '<tt>reuseaddr</tt>': Indicates that the rules used in
|
||||
validating addresses supplied in a <tt>bind()</tt> call
|
||||
should allow reuse of local addresses.
|
||||
Receives a boolean value;</li>
|
||||
<li> '<tt>reuseport</tt>': Allows completely duplicate
|
||||
bindings by multiple processes if they all set
|
||||
'<tt>reuseport</tt>' before binding the port.
|
||||
Receives a boolean value;</li>
|
||||
<li> '<tt>ip-multicast-loop</tt>':
|
||||
Specifies whether or not a copy of an outgoing multicast
|
||||
datagram is delivered to the sending host as long as it is a
|
||||
member of the multicast group.
|
||||
Receives a boolean value;</li>
|
||||
<li> '<tt>ipv6-v6only</tt>':
|
||||
Specifies whether to restrict <tt>inet6</tt> sockets to
|
||||
sending and receiving only IPv6 packets.
|
||||
Receive a boolean value;</li>
|
||||
<li> '<tt>ip-multicast-if</tt>':
|
||||
Sets the interface over which outgoing multicast datagrams
|
||||
are sent.
|
||||
Receives an IP address;</li>
|
||||
<li> '<tt>ip-multicast-ttl</tt>':
|
||||
Sets the Time To Live in the IP header for outgoing
|
||||
multicast datagrams.
|
||||
Receives a number;</li>
|
||||
<li> '<tt>ip-add-membership</tt>':
|
||||
Joins the multicast group specified.
|
||||
Receives a table with fields
|
||||
<tt>multiaddr</tt> and <tt>interface</tt>, each containing an
|
||||
IP address;</li>
|
||||
<li> '<tt>ip-drop-membership</tt>': Leaves the multicast
|
||||
group specified.
|
||||
Receives a table with fields
|
||||
<tt>multiaddr</tt> and <tt>interface</tt>, each containing an
|
||||
IP address.</li>
|
||||
</ul>
|
||||
|
||||
<p class="return">
|
||||
The method returns 1 in case of success, or
|
||||
<b><tt>nil</tt></b> followed by an error message otherwise.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The descriptions above come from the man pages.
|
||||
</p>
|
||||
|
||||
|
||||
<!-- setpeername +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="setpeername">
|
||||
connected:<b>setpeername(</b>'*'<b>)</b><br>
|
||||
unconnected:<b>setpeername(</b>address, port<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Changes the peer of a UDP object. This
|
||||
method turns an unconnected UDP object into a connected UDP
|
||||
object or vice versa.
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
For connected objects, outgoing datagrams
|
||||
will be sent to the specified peer, and datagrams received from
|
||||
other peers will be discarded by the OS. Connected UDP objects must
|
||||
use the <a href="#send"><tt>send</tt></a> and
|
||||
<a href="#receive"><tt>receive</tt></a> methods instead of
|
||||
<a href="#sendto"><tt>sendto</tt></a> and
|
||||
<a href="#receivefrom"><tt>receivefrom</tt></a>.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Address</tt> can be an IP address or a
|
||||
host name. <tt>Port</tt> is the port number. If <tt>address</tt> is
|
||||
'<tt>*</tt>' and the object is connected, the peer association is
|
||||
removed and the object becomes an unconnected object again. In that
|
||||
case, the <tt>port</tt> argument is ignored.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
In case of error the method returns
|
||||
<b><tt>nil</tt></b> followed by an error message. In case of success, the
|
||||
method returns 1.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: Since the address of the peer does not have
|
||||
to be passed to and from the OS, the use of connected UDP objects
|
||||
is recommended when the same peer is used for several transmissions
|
||||
and can result in up to 30% performance gains.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: Starting with LuaSocket 3.0, the host name resolution
|
||||
depends on whether the socket was created by <a
|
||||
href="#socket.udp"><tt>socket.udp</tt></a> or <a
|
||||
href="#socket.udp6"><tt>socket.udp6</tt></a>. Addresses from
|
||||
the appropriate family are tried in succession until the
|
||||
first success or until the last failure.
|
||||
</p>
|
||||
|
||||
<!-- setsockname +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="setsockname">
|
||||
unconnected:<b>setsockname(</b>address, port<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Binds the UDP object to a local address.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
<tt>Address</tt> can be an IP address or a
|
||||
host name. If <tt>address</tt> is '<tt>*</tt>' the system binds to
|
||||
all local interfaces using the constant <tt>INADDR_ANY</tt>. If
|
||||
<tt>port</tt> is 0, the system chooses an ephemeral port.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
If successful, the method returns 1. In case of
|
||||
error, the method returns <b><tt>nil</tt></b> followed by an error
|
||||
message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: This method can only be called before any
|
||||
datagram is sent through the UDP object, and only once. Otherwise,
|
||||
the system automatically binds the object to all local interfaces
|
||||
and chooses an ephemeral port as soon as the first datagram is
|
||||
sent. After the local address is set, either automatically by the
|
||||
system or explicitly by <tt>setsockname</tt>, it cannot be
|
||||
changed.
|
||||
</p>
|
||||
|
||||
<!-- settimeout +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="settimeout">
|
||||
connected:<b>settimeout(</b>value<b>)</b><br>
|
||||
unconnected:<b>settimeout(</b>value<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Changes the timeout values for the object. By default, the
|
||||
<a href="#receive"><tt>receive</tt></a> and
|
||||
<a href="#receivefrom"><tt>receivefrom</tt></a>
|
||||
operations are blocking. That is, any call to the methods will block
|
||||
indefinitely, until data arrives. The <tt>settimeout</tt> function defines
|
||||
a limit on the amount of time the functions can block. When a timeout is
|
||||
set and the specified amount of time has elapsed, the affected methods
|
||||
give up and fail with an error code.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
The amount of time to wait is specified as
|
||||
the <tt>value</tt> parameter, in seconds. The <b><tt>nil</tt></b> timeout
|
||||
<tt>value</tt> allows operations to block indefinitely. Negative
|
||||
timeout values have the same effect.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: In UDP, the <a href="#send"><tt>send</tt></a>
|
||||
and <a href="#sentdo"><tt>sendto</tt></a> methods never block (the
|
||||
datagram is just passed to the OS and the call returns
|
||||
immediately). Therefore, the <tt>settimeout</tt> method has no
|
||||
effect on them.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The old <tt>timeout</tt> method is
|
||||
deprecated. The name has been changed for sake of uniformity, since
|
||||
all other method names already contained verbs making their
|
||||
imperative nature obvious.
|
||||
</p>
|
||||
|
||||
<!-- socket.udp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="socket.udp">
|
||||
socket.<b>udp()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns an unconnected UDP object.
|
||||
Unconnected objects support the
|
||||
<a href="#sendto"><tt>sendto</tt></a>,
|
||||
<a href="#receive"><tt>receive</tt></a>,
|
||||
<a href="#receivefrom"><tt>receivefrom</tt></a>,
|
||||
<a href="#getoption"><tt>getoption</tt></a>,
|
||||
<a href="#getsockname"><tt>getsockname</tt></a>,
|
||||
<a href="#setoption"><tt>setoption</tt></a>,
|
||||
<a href="#settimeout"><tt>settimeout</tt></a>,
|
||||
<a href="#setpeername"><tt>setpeername</tt></a>,
|
||||
<a href="#setsockname"><tt>setsockname</tt></a>, and
|
||||
<a href="#close"><tt>close</tt></a>.
|
||||
The <a href="#setpeername"><tt>setpeername</tt></a>
|
||||
is used to connect the object.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, a new unconnected UDP object
|
||||
returned. In case of error, <b><tt>nil</tt></b> is returned, followed by
|
||||
an error message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The choice between IPv4 and IPv6 happens during a call to
|
||||
<a href="#sendto"><tt>sendto</tt></a>, <a
|
||||
href="#setpeername"><tt>setpeername</tt></a>, or <a
|
||||
href="#setsockname"><tt>sockname</tt></a>, depending on the address
|
||||
family obtained from the resolver.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: Before the choice between IPv4 and IPv6 happens,
|
||||
the internal socket object is invalid and therefore <a
|
||||
href="#setoption"><tt>setoption</tt></a> will fail.
|
||||
</p>
|
||||
|
||||
<!-- socket.udp4 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="socket.udp4">
|
||||
socket.<b>udp4()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns an unconnected IPv4 UDP object.
|
||||
Unconnected objects support the
|
||||
<a href="#sendto"><tt>sendto</tt></a>,
|
||||
<a href="#receive"><tt>receive</tt></a>,
|
||||
<a href="#receivefrom"><tt>receivefrom</tt></a>,
|
||||
<a href="#getoption"><tt>getoption</tt></a>,
|
||||
<a href="#getsockname"><tt>getsockname</tt></a>,
|
||||
<a href="#setoption"><tt>setoption</tt></a>,
|
||||
<a href="#settimeout"><tt>settimeout</tt></a>,
|
||||
<a href="#setpeername"><tt>setpeername</tt></a>,
|
||||
<a href="#setsockname"><tt>setsockname</tt></a>, and
|
||||
<a href="#close"><tt>close</tt></a>.
|
||||
The <a href="#setpeername"><tt>setpeername</tt></a>
|
||||
is used to connect the object.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, a new unconnected UDP object
|
||||
returned. In case of error, <b><tt>nil</tt></b> is returned, followed by
|
||||
an error message.
|
||||
</p>
|
||||
|
||||
<!-- socket.udp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="socket.udp6">
|
||||
socket.<b>udp6()</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
Creates and returns an unconnected IPv6 UDP object.
|
||||
Unconnected objects support the
|
||||
<a href="#sendto"><tt>sendto</tt></a>,
|
||||
<a href="#receive"><tt>receive</tt></a>,
|
||||
<a href="#receivefrom"><tt>receivefrom</tt></a>,
|
||||
<a href="#getoption"><tt>getoption</tt></a>,
|
||||
<a href="#getsockname"><tt>getsockname</tt></a>,
|
||||
<a href="#setoption"><tt>setoption</tt></a>,
|
||||
<a href="#settimeout"><tt>settimeout</tt></a>,
|
||||
<a href="#setpeername"><tt>setpeername</tt></a>,
|
||||
<a href="#setsockname"><tt>setsockname</tt></a>, and
|
||||
<a href="#close"><tt>close</tt></a>.
|
||||
The <a href="#setpeername"><tt>setpeername</tt></a>
|
||||
is used to connect the object.
|
||||
</p>
|
||||
|
||||
<p class="return">
|
||||
In case of success, a new unconnected UDP object
|
||||
returned. In case of error, <b><tt>nil</tt></b> is returned, followed by
|
||||
an error message.
|
||||
</p>
|
||||
|
||||
<p class="note">
|
||||
Note: The TCP object returned will have the option
|
||||
"<tt>ipv6-v6only</tt>" set to <tt><b>true</b></tt>.
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<!-- footer ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class="footer">
|
||||
<hr>
|
||||
<center>
|
||||
<p class="bar">
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:26:01 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
328
src/deps/src/luasocket/docs/url.html
vendored
328
src/deps/src/luasocket/docs/url.html
vendored
|
|
@ -1,328 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="description" content="LuaSocket: URL manipulation">
|
||||
<meta name="keywords" content="Lua, LuaSocket, URL, Library, Link, Network, Support">
|
||||
<title>LuaSocket: URL support</title>
|
||||
<link rel="stylesheet" href="reference.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class=header>
|
||||
<hr>
|
||||
<center>
|
||||
<table summary="LuaSocket logo">
|
||||
<tr><td align=center><a href="http://www.lua.org">
|
||||
<img width=128 height=128 border=0 alt="LuaSocket" src="luasocket.png">
|
||||
</a></td></tr>
|
||||
<tr><td align=center valign=top>Network support for the Lua language
|
||||
</td></tr>
|
||||
</table>
|
||||
<p class=bar>
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#download">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
</center>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<!-- url ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2 id="url">URL</h2>
|
||||
|
||||
<p>
|
||||
The <tt>url</tt> namespace provides functions to parse, protect,
|
||||
and build URLs, as well as functions to compose absolute URLs
|
||||
from base and relative URLs, according to
|
||||
<a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To obtain the <tt>url</tt> namespace, run:
|
||||
</p>
|
||||
|
||||
<pre class=example>
|
||||
-- loads the URL module
|
||||
local url = require("socket.url")
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
An URL is defined by the following grammar:
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<tt>
|
||||
<url> ::= [<scheme>:][//<authority>][/<path>][;<params>][?<query>][#<fragment>]<br>
|
||||
<authority> ::= [<userinfo>@]<host>[:<port>]<br>
|
||||
<userinfo> ::= <user>[:<password>]<br>
|
||||
<path> ::= {<segment>/}<segment><br>
|
||||
</tt>
|
||||
</blockquote>
|
||||
|
||||
<!-- absolute +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class=name id="absolute">
|
||||
url.<b>absolute(</b>base, relative<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class=description>
|
||||
Builds an absolute URL from a base URL and a relative URL.
|
||||
</p>
|
||||
|
||||
<p class=parameters>
|
||||
<tt>Base</tt> is a string with the base URL or
|
||||
a parsed URL table. <tt>Relative</tt> is a
|
||||
string with the relative URL.
|
||||
</p>
|
||||
|
||||
<p class=return>
|
||||
The function returns a string with the absolute URL.
|
||||
</p>
|
||||
|
||||
<p class=note>
|
||||
Note: The rules that
|
||||
govern the composition are fairly complex, and are described in detail in
|
||||
<a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>.
|
||||
The example bellow should give an idea of what the rules are.
|
||||
</p>
|
||||
|
||||
<pre class=example>
|
||||
http://a/b/c/d;p?q
|
||||
|
||||
+
|
||||
|
||||
g:h = g:h
|
||||
g = http://a/b/c/g
|
||||
./g = http://a/b/c/g
|
||||
g/ = http://a/b/c/g/
|
||||
/g = http://a/g
|
||||
//g = http://g
|
||||
?y = http://a/b/c/?y
|
||||
g?y = http://a/b/c/g?y
|
||||
#s = http://a/b/c/d;p?q#s
|
||||
g#s = http://a/b/c/g#s
|
||||
g?y#s = http://a/b/c/g?y#s
|
||||
;x = http://a/b/c/;x
|
||||
g;x = http://a/b/c/g;x
|
||||
g;x?y#s = http://a/b/c/g;x?y#s
|
||||
. = http://a/b/c/
|
||||
./ = http://a/b/c/
|
||||
.. = http://a/b/
|
||||
../ = http://a/b/
|
||||
../g = http://a/b/g
|
||||
../.. = http://a/
|
||||
../../ = http://a/
|
||||
../../g = http://a/g
|
||||
</pre>
|
||||
|
||||
<!-- build ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class=name id="build">
|
||||
url.<b>build(</b>parsed_url<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class=description>
|
||||
Rebuilds an URL from its parts.
|
||||
</p>
|
||||
|
||||
<p class=parameters>
|
||||
<tt>Parsed_url</tt> is a table with same components returned by
|
||||
<a href="#parse"><tt>parse</tt></a>.
|
||||
Lower level components, if specified,
|
||||
take precedence over high level components of the URL grammar.
|
||||
</p>
|
||||
|
||||
<p class=return>
|
||||
The function returns a string with the built URL.
|
||||
</p>
|
||||
|
||||
<!-- build_path +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class=name id="build_path">
|
||||
url.<b>build_path(</b>segments, unsafe<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class=description>
|
||||
Builds a <tt><path></tt> component from a list of
|
||||
<tt><segment></tt> parts.
|
||||
Before composition, any reserved characters found in a segment are escaped into
|
||||
their protected form, so that the resulting path is a valid URL path
|
||||
component.
|
||||
</p>
|
||||
|
||||
<p class=parameters>
|
||||
<tt>Segments</tt> is a list of strings with the <tt><segment></tt>
|
||||
parts. If <tt>unsafe</tt> is anything but <b><tt>nil</tt></b>, reserved
|
||||
characters are left untouched.
|
||||
</p>
|
||||
|
||||
<p class=return>
|
||||
The function returns a string with the
|
||||
built <tt><path></tt> component.
|
||||
</p>
|
||||
|
||||
<!-- escape +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class=name id="escape">
|
||||
url.<b>escape(</b>content<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class=description>
|
||||
Applies the URL escaping content coding to a string
|
||||
Each byte is encoded as a percent character followed
|
||||
by the two byte hexadecimal representation of its integer
|
||||
value.
|
||||
</p>
|
||||
|
||||
<p class=parameters>
|
||||
<tt>Content</tt> is the string to be encoded.
|
||||
</p>
|
||||
|
||||
<p class=result>
|
||||
The function returns the encoded string.
|
||||
</p>
|
||||
|
||||
<pre class=example>
|
||||
-- load url module
|
||||
url = require("socket.url")
|
||||
|
||||
code = url.escape("/#?;")
|
||||
-- code = "%2f%23%3f%3b"
|
||||
</pre>
|
||||
|
||||
<!-- parse ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class=name id="parse">
|
||||
url.<b>parse(</b>url, default<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class=description>
|
||||
Parses an URL given as a string into a Lua table with its components.
|
||||
</p>
|
||||
|
||||
<p class=parameters>
|
||||
<tt>Url</tt> is the URL to be parsed. If the <tt>default</tt> table is
|
||||
present, it is used to store the parsed fields. Only fields present in the
|
||||
URL are overwritten. Therefore, this table can be used to pass default
|
||||
values for each field.
|
||||
</p>
|
||||
|
||||
<p class=return>
|
||||
The function returns a table with all the URL components:
|
||||
</p>
|
||||
|
||||
<blockquote><tt>
|
||||
parsed_url = {<br>
|
||||
url = <i>string</i>,<br>
|
||||
scheme = <i>string</i>,<br>
|
||||
authority = <i>string</i>,<br>
|
||||
path = <i>string</i>,<br>
|
||||
params = <i>string</i>,<br>
|
||||
query = <i>string</i>,<br>
|
||||
fragment = <i>string</i>,<br>
|
||||
userinfo = <i>string</i>,<br>
|
||||
host = <i>string</i>,<br>
|
||||
port = <i>string</i>,<br>
|
||||
user = <i>string</i>,<br>
|
||||
password = <i>string</i><br>
|
||||
}
|
||||
</tt></blockquote>
|
||||
|
||||
<pre class=example>
|
||||
-- load url module
|
||||
url = require("socket.url")
|
||||
|
||||
parsed_url = url.parse("http://www.example.com/cgilua/index.lua?a=2#there")
|
||||
-- parsed_url = {
|
||||
-- scheme = "http",
|
||||
-- authority = "www.example.com",
|
||||
-- path = "/cgilua/index.lua"
|
||||
-- query = "a=2",
|
||||
-- fragment = "there",
|
||||
-- host = "www.puc-rio.br",
|
||||
-- }
|
||||
|
||||
parsed_url = url.parse("ftp://root:passwd@unsafe.org/pub/virus.exe;type=i")
|
||||
-- parsed_url = {
|
||||
-- scheme = "ftp",
|
||||
-- authority = "root:passwd@unsafe.org",
|
||||
-- path = "/pub/virus.exe",
|
||||
-- params = "type=i",
|
||||
-- userinfo = "root:passwd",
|
||||
-- host = "unsafe.org",
|
||||
-- user = "root",
|
||||
-- password = "passwd",
|
||||
-- }
|
||||
</pre>
|
||||
|
||||
<!-- parse_path +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class=name id="parse_path">
|
||||
url.<b>parse_path(</b>path<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class=description>
|
||||
Breaks a <tt><path></tt> URL component into all its
|
||||
<tt><segment></tt> parts.
|
||||
</p>
|
||||
|
||||
<p class=description>
|
||||
<tt>Path</tt> is a string with the path to be parsed.
|
||||
</p>
|
||||
|
||||
<p class=return>
|
||||
Since some characters are reserved in URLs, they must be escaped
|
||||
whenever present in a <tt><path></tt> component. Therefore, before
|
||||
returning a list with all the parsed segments, the function removes
|
||||
escaping from all of them.
|
||||
</p>
|
||||
|
||||
<!-- unescape +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class=name id="unescape">
|
||||
url.<b>unescape(</b>content<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class=description>
|
||||
Removes the URL escaping content coding from a string.
|
||||
</p>
|
||||
|
||||
<p class=parameters>
|
||||
<tt>Content</tt> is the string to be decoded.
|
||||
</p>
|
||||
|
||||
<p class=return>
|
||||
The function returns the decoded string.
|
||||
</p>
|
||||
|
||||
<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<div class=footer>
|
||||
<hr>
|
||||
<center>
|
||||
<p class=bar>
|
||||
<a href="index.html">home</a> ·
|
||||
<a href="index.html#down">download</a> ·
|
||||
<a href="installation.html">installation</a> ·
|
||||
<a href="introduction.html">introduction</a> ·
|
||||
<a href="reference.html">reference</a>
|
||||
</p>
|
||||
<p>
|
||||
<small>
|
||||
Last modified by Diego Nehab on <br>
|
||||
Thu Apr 20 00:26:05 EDT 2006
|
||||
</small>
|
||||
</p>
|
||||
</center>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
14
src/deps/src/luasocket/test/README
vendored
14
src/deps/src/luasocket/test/README
vendored
|
|
@ -1,14 +0,0 @@
|
|||
This provides the automated test scripts used to make sure the library
|
||||
is working properly.
|
||||
|
||||
The files provided are:
|
||||
|
||||
testsrvr.lua -- test server
|
||||
testclnt.lua -- test client
|
||||
|
||||
To run these tests, just run lua on the server and then on the client.
|
||||
|
||||
hello.lua -- run to verify if installation worked
|
||||
|
||||
Good luck,
|
||||
Diego.
|
||||
4
src/deps/src/luasocket/test/auth/.htaccess
vendored
4
src/deps/src/luasocket/test/auth/.htaccess
vendored
|
|
@ -1,4 +0,0 @@
|
|||
AuthName "test-auth"
|
||||
AuthType Basic
|
||||
AuthUserFile /home/diego/impa/luasocket/test/auth/.htpasswd
|
||||
Require valid-user
|
||||
1
src/deps/src/luasocket/test/auth/.htpasswd
vendored
1
src/deps/src/luasocket/test/auth/.htpasswd
vendored
|
|
@ -1 +0,0 @@
|
|||
luasocket:$apr1$47u2O.Me$.m/5BWAtt7GVoxsouIPBR1
|
||||
3002
src/deps/src/luasocket/test/auth/index.html
vendored
3002
src/deps/src/luasocket/test/auth/index.html
vendored
File diff suppressed because it is too large
Load diff
6
src/deps/src/luasocket/test/cgi/cat
vendored
6
src/deps/src/luasocket/test/cgi/cat
vendored
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/sh
|
||||
echo Content-type: text/plain
|
||||
echo
|
||||
|
||||
cat > /tmp/luasocket.cat.tmp
|
||||
cat /tmp/luasocket.cat.tmp
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
#!/bin/sh
|
||||
echo Content-type: text/plain
|
||||
echo
|
||||
|
||||
cat ../index.html
|
||||
5
src/deps/src/luasocket/test/cgi/env
vendored
5
src/deps/src/luasocket/test/cgi/env
vendored
|
|
@ -1,5 +0,0 @@
|
|||
#!/bin/sh
|
||||
echo Content-type: text/plain
|
||||
echo
|
||||
|
||||
env
|
||||
4
src/deps/src/luasocket/test/cgi/query-string
vendored
4
src/deps/src/luasocket/test/cgi/query-string
vendored
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/sh
|
||||
echo Content-type: text/plain
|
||||
echo
|
||||
echo $QUERY_STRING
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/sh
|
||||
echo Location: http://$HTTP_HOST$REQUEST_URI
|
||||
echo
|
||||
4
src/deps/src/luasocket/test/cgi/request-uri
vendored
4
src/deps/src/luasocket/test/cgi/request-uri
vendored
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/sh
|
||||
echo Content-type: text/plain
|
||||
echo
|
||||
echo $REQUEST_URI
|
||||
5
src/deps/src/luasocket/test/dicttest.lua
vendored
5
src/deps/src/luasocket/test/dicttest.lua
vendored
|
|
@ -1,5 +0,0 @@
|
|||
local dict = require"socket.dict"
|
||||
|
||||
print(dict.get("dict://localhost/d:teste"))
|
||||
|
||||
for i,v in pairs(dict.get("dict://localhost/d:teste")) do print(v) end
|
||||
30
src/deps/src/luasocket/test/excepttest.lua
vendored
30
src/deps/src/luasocket/test/excepttest.lua
vendored
|
|
@ -1,30 +0,0 @@
|
|||
local socket = require("socket")
|
||||
|
||||
local finalizer_called
|
||||
|
||||
local func = socket.protect(function(err, ...)
|
||||
local try = socket.newtry(function()
|
||||
finalizer_called = true
|
||||
end)
|
||||
|
||||
if err then
|
||||
return error(err, 0)
|
||||
else
|
||||
return try(...)
|
||||
end
|
||||
end)
|
||||
|
||||
local ret1, ret2, ret3 = func(false, 1, 2, 3)
|
||||
assert(not finalizer_called, "unexpected finalizer call")
|
||||
assert(ret1 == 1 and ret2 == 2 and ret3 == 3, "incorrect return values")
|
||||
|
||||
ret1, ret2, ret3 = func(false, false, "error message")
|
||||
assert(finalizer_called, "finalizer not called")
|
||||
assert(ret1 == nil and ret2 == "error message" and ret3 == nil, "incorrect return values")
|
||||
|
||||
local err = {key = "value"}
|
||||
ret1, ret2 = pcall(func, err)
|
||||
assert(not ret1, "error not rethrown")
|
||||
assert(ret2 == err, "incorrect error rethrown")
|
||||
|
||||
print("OK")
|
||||
32
src/deps/src/luasocket/test/find-connect-limit
vendored
32
src/deps/src/luasocket/test/find-connect-limit
vendored
|
|
@ -1,32 +0,0 @@
|
|||
#!/usr/bin/env lua
|
||||
--[[
|
||||
Find out how many TCP connections we can make.
|
||||
|
||||
Use ulimit to increase the max number of descriptors:
|
||||
|
||||
ulimit -n 10000
|
||||
ulimit -n
|
||||
|
||||
You'll probably need to be root to do this.
|
||||
]]
|
||||
|
||||
socket = require "socket"
|
||||
|
||||
host = arg[1] or "google.com"
|
||||
port = arg[2] or 80
|
||||
|
||||
connections = {}
|
||||
|
||||
repeat
|
||||
c = assert(socket.connect(hostip or host, 80))
|
||||
table.insert(connections, c)
|
||||
|
||||
if not hostip then
|
||||
hostip = c:getpeername()
|
||||
print("resolved", host, "to", hostip)
|
||||
end
|
||||
|
||||
print("connection #", #connections, c, "fd", c:getfd())
|
||||
|
||||
until false
|
||||
|
||||
122
src/deps/src/luasocket/test/ftptest.lua
vendored
122
src/deps/src/luasocket/test/ftptest.lua
vendored
|
|
@ -1,122 +0,0 @@
|
|||
local socket = require("socket")
|
||||
local ftp = require("socket.ftp")
|
||||
local url = require("socket.url")
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- use dscl to create user "luasocket" with password "password"
|
||||
-- with home in /Users/diego/luasocket/test/ftp
|
||||
-- with group com.apple.access_ftp
|
||||
-- with shell set to /sbin/nologin
|
||||
-- set /etc/ftpchroot to chroot luasocket
|
||||
-- must set group com.apple.access_ftp on user _ftp (for anonymous access)
|
||||
-- copy index.html to /var/empty/pub (home of user ftp)
|
||||
-- start ftp server with
|
||||
-- sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist
|
||||
-- copy index.html to /Users/diego/luasocket/test/ftp
|
||||
-- stop with
|
||||
-- sudo -s launchctl unload -w /System/Library/LaunchDaemons/ftp.plist
|
||||
|
||||
-- override protection to make sure we see all errors
|
||||
--socket.protect = function(s) return s end
|
||||
|
||||
dofile("testsupport.lua")
|
||||
|
||||
local host = host or "localhost"
|
||||
local port, index_file, index, back, err, ret
|
||||
|
||||
local t = socket.gettime()
|
||||
|
||||
index_file = "index.html"
|
||||
|
||||
-- a function that returns a directory listing
|
||||
local function nlst(u)
|
||||
local t = {}
|
||||
local p = url.parse(u)
|
||||
p.command = "nlst"
|
||||
p.sink = ltn12.sink.table(t)
|
||||
local r, e = ftp.get(p)
|
||||
return r and table.concat(t), e
|
||||
end
|
||||
|
||||
-- function that removes a remote file
|
||||
local function dele(u)
|
||||
local p = url.parse(u)
|
||||
p.command = "dele"
|
||||
p.argument = string.gsub(p.path, "^/", "")
|
||||
if p.argumet == "" then p.argument = nil end
|
||||
p.check = 250
|
||||
return ftp.command(p)
|
||||
end
|
||||
|
||||
-- read index with CRLF convention
|
||||
index = readfile(index_file)
|
||||
|
||||
io.write("testing wrong scheme: ")
|
||||
back, err = ftp.get("wrong://banana.com/lixo")
|
||||
assert(not back and err == "wrong scheme 'wrong'", err)
|
||||
print("ok")
|
||||
|
||||
io.write("testing invalid url: ")
|
||||
back, err = ftp.get("localhost/dir1/index.html;type=i")
|
||||
assert(not back and err)
|
||||
print("ok")
|
||||
|
||||
io.write("testing anonymous file download: ")
|
||||
back, err = socket.ftp.get("ftp://" .. host .. "/pub/index.html;type=i")
|
||||
assert(not err and back == index, err)
|
||||
print("ok")
|
||||
|
||||
io.write("erasing before upload: ")
|
||||
ret, err = dele("ftp://luasocket:password@" .. host .. "/index.up.html")
|
||||
if not ret then print(err)
|
||||
else print("ok") end
|
||||
|
||||
io.write("testing upload: ")
|
||||
ret, err = ftp.put("ftp://luasocket:password@" .. host .. "/index.up.html;type=i", index)
|
||||
assert(ret and not err, err)
|
||||
print("ok")
|
||||
|
||||
io.write("downloading uploaded file: ")
|
||||
back, err = ftp.get("ftp://luasocket:password@" .. host .. "/index.up.html;type=i")
|
||||
assert(ret and not err and index == back, err)
|
||||
print("ok")
|
||||
|
||||
io.write("erasing after upload/download: ")
|
||||
ret, err = dele("ftp://luasocket:password@" .. host .. "/index.up.html")
|
||||
assert(ret and not err, err)
|
||||
print("ok")
|
||||
|
||||
io.write("testing weird-character translation: ")
|
||||
back, err = ftp.get("ftp://luasocket:password@" .. host .. "/%23%3f;type=i")
|
||||
assert(not err and back == index, err)
|
||||
print("ok")
|
||||
|
||||
io.write("testing parameter overriding: ")
|
||||
local back = {}
|
||||
ret, err = ftp.get{
|
||||
url = "//stupid:mistake@" .. host .. "/index.html",
|
||||
user = "luasocket",
|
||||
password = "password",
|
||||
type = "i",
|
||||
sink = ltn12.sink.table(back)
|
||||
}
|
||||
assert(ret and not err and table.concat(back) == index, err)
|
||||
print("ok")
|
||||
|
||||
io.write("testing upload denial: ")
|
||||
ret, err = ftp.put("ftp://" .. host .. "/index.up.html;type=a", index)
|
||||
assert(not ret and err, "should have failed")
|
||||
print(err)
|
||||
|
||||
io.write("testing authentication failure: ")
|
||||
ret, err = ftp.get("ftp://luasocket:wrong@".. host .. "/index.html;type=a")
|
||||
assert(not ret and err, "should have failed")
|
||||
print(err)
|
||||
|
||||
io.write("testing wrong file: ")
|
||||
back, err = ftp.get("ftp://".. host .. "/index.wrong.html;type=a")
|
||||
assert(not back and err, "should have failed")
|
||||
print(err)
|
||||
|
||||
print("passed all tests")
|
||||
print(string.format("done in %.2fs", socket.gettime() - t))
|
||||
3
src/deps/src/luasocket/test/hello.lua
vendored
3
src/deps/src/luasocket/test/hello.lua
vendored
|
|
@ -1,3 +0,0 @@
|
|||
local socket = require"socket"
|
||||
local mime = require"mime"
|
||||
print("Hello from " .. socket._VERSION .. " and " .. mime._VERSION .. "!")
|
||||
441
src/deps/src/luasocket/test/httptest.lua
vendored
441
src/deps/src/luasocket/test/httptest.lua
vendored
|
|
@ -1,441 +0,0 @@
|
|||
-- needs Alias from /home/c/diego/tec/luasocket/test to
|
||||
-- "/luasocket-test" and "/luasocket-test/"
|
||||
-- needs ScriptAlias from /home/c/diego/tec/luasocket/test/cgi
|
||||
-- to "/luasocket-test-cgi" and "/luasocket-test-cgi/"
|
||||
-- needs "AllowOverride AuthConfig" on /home/c/diego/tec/luasocket/test/auth
|
||||
local socket = require("socket")
|
||||
local http = require("socket.http")
|
||||
local url = require("socket.url")
|
||||
|
||||
local mime = require("mime")
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
-- override protection to make sure we see all errors
|
||||
-- socket.protect = function(s) return s end
|
||||
|
||||
dofile("testsupport.lua")
|
||||
|
||||
local host, proxy, request, response, index_file
|
||||
local ignore, expect, index, prefix, cgiprefix, index_crlf
|
||||
|
||||
http.TIMEOUT = 10
|
||||
|
||||
local t = socket.gettime()
|
||||
|
||||
--host = host or "diego.student.princeton.edu"
|
||||
--host = host or "diego.student.princeton.edu"
|
||||
host = host or "localhost"
|
||||
proxy = proxy or "http://localhost:3128"
|
||||
prefix = prefix or "/luasocket-test"
|
||||
cgiprefix = cgiprefix or "/luasocket-test-cgi"
|
||||
index_file = "index.html"
|
||||
|
||||
-- read index with CRLF convention
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
local check_request = function(request, expect, ignore)
|
||||
local t
|
||||
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 = {}
|
||||
response.code, response.headers, response.status =
|
||||
socket.skip(1, http.request(request))
|
||||
if t and #t > 0 then response.body = table.concat(t) end
|
||||
check_result(response, expect, ignore)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing request uri correctness: ")
|
||||
local forth = cgiprefix .. "/request-uri?" .. "this+is+the+query+string"
|
||||
local back, c, h = http.request("http://" .. host .. forth)
|
||||
if not back then fail(c) end
|
||||
back = url.parse(back)
|
||||
if similar(back.query, "this+is+the+query+string") then print("ok")
|
||||
else fail(back.query) end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing query string correctness: ")
|
||||
forth = "this+is+the+query+string"
|
||||
back = http.request("http://" .. host .. cgiprefix ..
|
||||
"/query-string?" .. forth)
|
||||
if similar(back, forth) then print("ok")
|
||||
else fail("failed!") end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing document retrieval: ")
|
||||
request = {
|
||||
url = "http://" .. host .. prefix .. "/index.html"
|
||||
}
|
||||
expect = {
|
||||
body = index,
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing redirect loop: ")
|
||||
request = {
|
||||
url = "http://" .. host .. cgiprefix .. "/redirect-loop"
|
||||
}
|
||||
expect = {
|
||||
code = 302
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1,
|
||||
body = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing invalid url: ")
|
||||
local r, e = http.request{url = host .. prefix}
|
||||
assert(r == nil and e == "invalid host ''")
|
||||
r, re = http.request(host .. prefix)
|
||||
assert(r == nil and e == re, tostring(r) ..", " .. tostring(re) ..
|
||||
" vs " .. tostring(e))
|
||||
print("ok")
|
||||
|
||||
io.write("testing invalid empty port: ")
|
||||
request = {
|
||||
url = "http://" .. host .. ":" .. prefix .. "/index.html"
|
||||
}
|
||||
expect = {
|
||||
body = index,
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
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,
|
||||
-- remove content-length header to send chunked body
|
||||
headers = { ["content-length"] = string.len(index) }
|
||||
}
|
||||
expect = {
|
||||
body = index,
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
--[[
|
||||
io.write("testing proxy with post method: ")
|
||||
request = {
|
||||
url = "http://" .. host .. cgiprefix .. "/cat",
|
||||
method = "POST",
|
||||
body = index,
|
||||
headers = { ["content-length"] = string.len(index) },
|
||||
proxy= proxy
|
||||
}
|
||||
expect = {
|
||||
body = index,
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
]]
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing simple post function: ")
|
||||
back = http.request("http://" .. host .. cgiprefix .. "/cat", index)
|
||||
assert(back == index)
|
||||
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")),
|
||||
sink = ltn12.sink.file(io.open(index_file .. "-back", "wb")),
|
||||
headers = { ["content-length"] = string.len(index) }
|
||||
}
|
||||
expect = {
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
back = readfile(index_file .. "-back")
|
||||
assert(back == index)
|
||||
os.remove(index_file .. "-back")
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing ltn12.(sink|source).chain and mime.(encode|decode): ")
|
||||
|
||||
local function b64length(len)
|
||||
local a = math.ceil(len/3)*4
|
||||
local l = math.ceil(a/76)
|
||||
return a + l*2
|
||||
end
|
||||
|
||||
local source = ltn12.source.chain(
|
||||
ltn12.source.file(io.open(index_file, "rb")),
|
||||
ltn12.filter.chain(
|
||||
mime.encode("base64"),
|
||||
mime.wrap("base64")
|
||||
)
|
||||
)
|
||||
|
||||
local sink = ltn12.sink.chain(
|
||||
mime.decode("base64"),
|
||||
ltn12.sink.file(io.open(index_file .. "-back", "wb"))
|
||||
)
|
||||
|
||||
request = {
|
||||
url = "http://" .. host .. cgiprefix .. "/cat",
|
||||
method = "POST",
|
||||
source = source,
|
||||
sink = sink,
|
||||
headers = { ["content-length"] = b64length(string.len(index)) }
|
||||
}
|
||||
expect = {
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
body_cb = 1,
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
back = readfile(index_file .. "-back")
|
||||
assert(back == index)
|
||||
os.remove(index_file .. "-back")
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing http redirection: ")
|
||||
request = {
|
||||
url = "http://" .. host .. prefix
|
||||
}
|
||||
expect = {
|
||||
body = index,
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
--[[
|
||||
io.write("testing proxy with redirection: ")
|
||||
request = {
|
||||
url = "http://" .. host .. prefix,
|
||||
proxy = proxy
|
||||
}
|
||||
expect = {
|
||||
body = index,
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
]]
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing automatic auth failure: ")
|
||||
request = {
|
||||
url = "http://really:wrong@" .. host .. prefix .. "/auth/index.html"
|
||||
}
|
||||
expect = {
|
||||
code = 401
|
||||
}
|
||||
ignore = {
|
||||
body = 1,
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing http redirection failure: ")
|
||||
request = {
|
||||
url = "http://" .. host .. prefix,
|
||||
redirect = false
|
||||
}
|
||||
expect = {
|
||||
code = 301
|
||||
}
|
||||
ignore = {
|
||||
body = 1,
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing document not found: ")
|
||||
request = {
|
||||
url = "http://" .. host .. "/wrongdocument.html"
|
||||
}
|
||||
expect = {
|
||||
code = 404
|
||||
}
|
||||
ignore = {
|
||||
body = 1,
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing auth failure: ")
|
||||
request = {
|
||||
url = "http://" .. host .. prefix .. "/auth/index.html"
|
||||
}
|
||||
expect = {
|
||||
code = 401
|
||||
}
|
||||
ignore = {
|
||||
body = 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"))
|
||||
}
|
||||
}
|
||||
expect = {
|
||||
code = 200,
|
||||
body = index
|
||||
}
|
||||
ignore = {
|
||||
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"
|
||||
}
|
||||
expect = {
|
||||
code = 200,
|
||||
body = index
|
||||
}
|
||||
ignore = {
|
||||
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"
|
||||
}
|
||||
expect = {
|
||||
code = 200,
|
||||
body = index
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing cgi output retrieval (probably chunked...): ")
|
||||
request = {
|
||||
url = "http://" .. host .. cgiprefix .. "/cat-index-html"
|
||||
}
|
||||
expect = {
|
||||
body = index,
|
||||
code = 200
|
||||
}
|
||||
ignore = {
|
||||
status = 1,
|
||||
headers = 1
|
||||
}
|
||||
check_request(request, expect, ignore)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
local body
|
||||
io.write("testing simple request function: ")
|
||||
body = http.request("http://" .. host .. prefix .. "/index.html")
|
||||
assert(body == index)
|
||||
print("ok")
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing HEAD method: ")
|
||||
local r, c, h = http.request {
|
||||
method = "HEAD",
|
||||
url = "http://www.tecgraf.puc-rio.br/~diego/"
|
||||
}
|
||||
assert(r and h and (c == 200), c)
|
||||
print("ok")
|
||||
|
||||
------------------------------------------------------------------------
|
||||
io.write("testing host not found: ")
|
||||
local c, e = socket.connect("example.invalid", 80)
|
||||
local r, re = http.request{url = "http://example.invalid/does/not/exist"}
|
||||
assert(r == nil and e == re, tostring(r) .. " " .. tostring(re))
|
||||
r, re = http.request("http://example.invalid/does/not/exist")
|
||||
assert(r == nil and e == re)
|
||||
print("ok")
|
||||
|
||||
------------------------------------------------------------------------
|
||||
print("passed all tests")
|
||||
os.remove("err")
|
||||
|
||||
print(string.format("done in %.2fs", socket.gettime() - t))
|
||||
3002
src/deps/src/luasocket/test/index.html
vendored
3002
src/deps/src/luasocket/test/index.html
vendored
File diff suppressed because it is too large
Load diff
308
src/deps/src/luasocket/test/ltn12test.lua
vendored
308
src/deps/src/luasocket/test/ltn12test.lua
vendored
|
|
@ -1,308 +0,0 @@
|
|||
local ltn12 = require("ltn12")
|
||||
|
||||
dofile("testsupport.lua")
|
||||
|
||||
local function format(chunk)
|
||||
if chunk then
|
||||
if chunk == "" then return "''"
|
||||
else return string.len(chunk) end
|
||||
else return "nil" end
|
||||
end
|
||||
|
||||
local function show(name, input, output)
|
||||
local sin = format(input)
|
||||
local sout = format(output)
|
||||
io.write(name, ": ", sin, " -> ", sout, "\n")
|
||||
end
|
||||
|
||||
local function chunked(length)
|
||||
local tmp
|
||||
return function(chunk)
|
||||
local ret
|
||||
if chunk and chunk ~= "" then
|
||||
tmp = chunk
|
||||
end
|
||||
ret = string.sub(tmp, 1, length)
|
||||
tmp = string.sub(tmp, length+1)
|
||||
if not chunk and ret == "" then ret = nil end
|
||||
return ret
|
||||
end
|
||||
end
|
||||
|
||||
local function named(f, name)
|
||||
return function(chunk)
|
||||
local ret = f(chunk)
|
||||
show(name, chunk, ret)
|
||||
return ret
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------
|
||||
local function split(size)
|
||||
local buffer = ""
|
||||
local last_out = ""
|
||||
local last_in = ""
|
||||
local function output(chunk)
|
||||
local part = string.sub(buffer, 1, size)
|
||||
buffer = string.sub(buffer, size+1)
|
||||
last_out = (part ~= "" or chunk) and part
|
||||
last_in = chunk
|
||||
return last_out
|
||||
end
|
||||
return function(chunk, done)
|
||||
if done then
|
||||
return not last_in and not last_out
|
||||
end
|
||||
-- check if argument is consistent with state
|
||||
if not chunk then
|
||||
if last_in and last_in ~= "" and last_out ~= "" then
|
||||
error("nil chunk following data chunk", 2)
|
||||
end
|
||||
if not last_out then error("extra nil chunk", 2) end
|
||||
return output(chunk)
|
||||
elseif chunk == "" then
|
||||
if last_out == "" then error('extra "" chunk', 2) end
|
||||
if not last_out then error('"" chunk following nil return', 2) end
|
||||
if not last_in then error('"" chunk following nil chunk', 2) end
|
||||
return output(chunk)
|
||||
else
|
||||
if not last_in then error("data chunk following nil chunk", 2) end
|
||||
if last_in ~= "" and last_out ~= "" then
|
||||
error("data chunk following data chunk", 2)
|
||||
end
|
||||
buffer = chunk
|
||||
return output(chunk)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------
|
||||
local function format(chunk)
|
||||
if chunk then
|
||||
if chunk == "" then return "''"
|
||||
else return string.len(chunk) end
|
||||
else return "nil" end
|
||||
end
|
||||
|
||||
--------------------------------
|
||||
local function merge(size)
|
||||
local buffer = ""
|
||||
local last_out = ""
|
||||
local last_in = ""
|
||||
local function output(chunk)
|
||||
local part
|
||||
if string.len(buffer) >= size or not chunk then
|
||||
part = buffer
|
||||
buffer = ""
|
||||
else
|
||||
part = ""
|
||||
end
|
||||
last_out = (part ~= "" or chunk) and part
|
||||
last_in = chunk
|
||||
return last_out
|
||||
end
|
||||
return function(chunk, done)
|
||||
if done then
|
||||
return not last_in and not last_out
|
||||
end
|
||||
-- check if argument is consistent with state
|
||||
if not chunk then
|
||||
if last_in and last_in ~= "" and last_out ~= "" then
|
||||
error("nil chunk following data chunk", 2)
|
||||
end
|
||||
if not last_out then error("extra nil chunk", 2) end
|
||||
return output(chunk)
|
||||
elseif chunk == "" then
|
||||
if last_out == "" then error('extra "" chunk', 2) end
|
||||
if not last_out then error('"" chunk following nil return', 2) end
|
||||
if not last_in then error('"" chunk following nil chunk', 2) end
|
||||
return output(chunk)
|
||||
else
|
||||
if not last_in then error("data chunk following nil chunk", 2) end
|
||||
if last_in ~= "" and last_out ~= "" then
|
||||
error("data chunk following data chunk", 2)
|
||||
end
|
||||
buffer = buffer .. chunk
|
||||
return output(chunk)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------
|
||||
io.write("testing sink.table: ")
|
||||
local sink, t = ltn12.sink.table()
|
||||
local s, c = "", ""
|
||||
for i = 0, 10 do
|
||||
c = string.rep(string.char(i), i)
|
||||
s = s .. c
|
||||
assert(sink(c), "returned error")
|
||||
end
|
||||
assert(sink(nil), "returned error")
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing sink.chain (with split): ")
|
||||
sink, t = ltn12.sink.table()
|
||||
local filter = split(3)
|
||||
sink = ltn12.sink.chain(filter, sink)
|
||||
s = "123456789012345678901234567890"
|
||||
assert(sink(s), "returned error")
|
||||
assert(sink(s), "returned error")
|
||||
assert(sink(nil), "returned error")
|
||||
assert(table.concat(t) == s .. s, "mismatch")
|
||||
assert(filter(nil, 1), "filter not empty")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing sink.chain (with merge): ")
|
||||
sink, t = ltn12.sink.table()
|
||||
filter = merge(10)
|
||||
sink = ltn12.sink.chain(filter, sink)
|
||||
s = string.rep("123", 30)
|
||||
s = s .. string.rep("4321", 30)
|
||||
for i = 1, 30 do
|
||||
assert(sink("123"), "returned error")
|
||||
end
|
||||
for i = 1, 30 do
|
||||
assert(sink("4321"), "returned error")
|
||||
end
|
||||
assert(sink(nil), "returned error")
|
||||
assert(filter(nil, 1), "filter not empty")
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing source.string and pump.all: ")
|
||||
local source = ltn12.source.string(s)
|
||||
sink, t = ltn12.sink.table()
|
||||
assert(ltn12.pump.all(source, sink), "returned error")
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing source.table: ")
|
||||
local inp = {'a','b','c','d','e'}
|
||||
local source = ltn12.source.table(inp)
|
||||
sink, t = ltn12.sink.table()
|
||||
assert(ltn12.pump.all(source, sink), "returned error")
|
||||
for i = 1, #inp do assert(t[i] == inp[i], "mismatch") end
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing source.chain (with split): ")
|
||||
source = ltn12.source.string(s)
|
||||
filter = split(5)
|
||||
source = ltn12.source.chain(source, filter)
|
||||
sink, t = ltn12.sink.table()
|
||||
assert(ltn12.pump.all(source, sink), "returned error")
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
assert(filter(nil, 1), "filter not empty")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing source.chain (with several filters): ")
|
||||
local function double(x) -- filter turning "ABC" into "AABBCC"
|
||||
if not x then return end
|
||||
local b={}
|
||||
for k in x:gmatch'.' do table.insert(b, k..k) end
|
||||
return table.concat(b)
|
||||
end
|
||||
source = ltn12.source.string(s)
|
||||
source = ltn12.source.chain(source, double, double, double)
|
||||
sink, t = ltn12.sink.table()
|
||||
assert(ltn12.pump.all(source, sink), "returned error")
|
||||
assert(table.concat(t) == double(double(double(s))), "mismatch")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing source.chain (with split) and sink.chain (with merge): ")
|
||||
source = ltn12.source.string(s)
|
||||
filter = split(5)
|
||||
source = ltn12.source.chain(source, filter)
|
||||
local filter2 = merge(13)
|
||||
sink, t = ltn12.sink.table()
|
||||
sink = ltn12.sink.chain(filter2, sink)
|
||||
assert(ltn12.pump.all(source, sink), "returned error")
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
assert(filter(nil, 1), "filter not empty")
|
||||
assert(filter2(nil, 1), "filter2 not empty")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing sink.chain (with several filters): ")
|
||||
source = ltn12.source.string(s)
|
||||
sink, t = ltn12.sink.table()
|
||||
sink = ltn12.sink.chain(double, double, double, sink)
|
||||
assert(ltn12.pump.all(source, sink), "returned error")
|
||||
assert(table.concat(t) == double(double(double(s))), "mismatch")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing filter.chain (and sink.chain, with split, merge): ")
|
||||
source = ltn12.source.string(s)
|
||||
filter = split(5)
|
||||
filter2 = merge(13)
|
||||
local chain = ltn12.filter.chain(filter, filter2)
|
||||
sink, t = ltn12.sink.table()
|
||||
sink = ltn12.sink.chain(chain, sink)
|
||||
assert(ltn12.pump.all(source, sink), "returned error")
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
assert(filter(nil, 1), "filter not empty")
|
||||
assert(filter2(nil, 1), "filter2 not empty")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing filter.chain (and sink.chain, a bunch): ")
|
||||
source = ltn12.source.string(s)
|
||||
filter = split(5)
|
||||
filter2 = merge(13)
|
||||
local filter3 = split(7)
|
||||
local filter4 = merge(11)
|
||||
local filter5 = split(10)
|
||||
chain = ltn12.filter.chain(filter, filter2, filter3, filter4, filter5)
|
||||
sink, t = ltn12.sink.table()
|
||||
sink = ltn12.sink.chain(chain, sink)
|
||||
assert(ltn12.pump.all(source, sink))
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
assert(filter(nil, 1), "filter not empty")
|
||||
assert(filter2(nil, 1), "filter2 not empty")
|
||||
assert(filter3(nil, 1), "filter3 not empty")
|
||||
assert(filter4(nil, 1), "filter4 not empty")
|
||||
assert(filter5(nil, 1), "filter5 not empty")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing filter.chain (and source.chain, with split, merge): ")
|
||||
source = ltn12.source.string(s)
|
||||
filter = split(5)
|
||||
filter2 = merge(13)
|
||||
local chain = ltn12.filter.chain(filter, filter2)
|
||||
sink, t = ltn12.sink.table()
|
||||
source = ltn12.source.chain(source, chain)
|
||||
assert(ltn12.pump.all(source, sink), "returned error")
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
assert(filter(nil, 1), "filter not empty")
|
||||
assert(filter2(nil, 1), "filter2 not empty")
|
||||
print("ok")
|
||||
|
||||
--------------------------------
|
||||
io.write("testing filter.chain (and source.chain, a bunch): ")
|
||||
source = ltn12.source.string(s)
|
||||
filter = split(5)
|
||||
filter2 = merge(13)
|
||||
local filter3 = split(7)
|
||||
local filter4 = merge(11)
|
||||
local filter5 = split(10)
|
||||
chain = ltn12.filter.chain(filter, filter2, filter3, filter4, filter5)
|
||||
sink, t = ltn12.sink.table()
|
||||
source = ltn12.source.chain(source, chain)
|
||||
assert(ltn12.pump.all(source, sink))
|
||||
assert(table.concat(t) == s, "mismatch")
|
||||
assert(filter(nil, 1), "filter not empty")
|
||||
assert(filter2(nil, 1), "filter2 not empty")
|
||||
assert(filter3(nil, 1), "filter3 not empty")
|
||||
assert(filter4(nil, 1), "filter4 not empty")
|
||||
assert(filter5(nil, 1), "filter5 not empty")
|
||||
print("ok")
|
||||
|
||||
BIN
src/deps/src/luasocket/test/luasocket.png
vendored
BIN
src/deps/src/luasocket/test/luasocket.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
299
src/deps/src/luasocket/test/mimetest.lua
vendored
299
src/deps/src/luasocket/test/mimetest.lua
vendored
|
|
@ -1,299 +0,0 @@
|
|||
local socket = require("socket")
|
||||
local ltn12 = require("ltn12")
|
||||
local mime = require("mime")
|
||||
|
||||
local unpack = unpack or table.unpack
|
||||
|
||||
dofile("testsupport.lua")
|
||||
|
||||
local qptest = "qptest.bin"
|
||||
local eqptest = "qptest.bin2"
|
||||
local dqptest = "qptest.bin3"
|
||||
|
||||
local b64test = "b64test.bin"
|
||||
local eb64test = "b64test.bin2"
|
||||
local db64test = "b64test.bin3"
|
||||
|
||||
|
||||
-- from Machado de Assis, "A M<>o e a Rosa"
|
||||
local mao = [[
|
||||
Cursavam estes dois mo<EFBFBD>os a academia de S. Paulo, estando
|
||||
Lu<EFBFBD>s Alves no quarto ano e Est<EFBFBD>v<EFBFBD>o no terceiro.
|
||||
Conheceram-se na academia, e ficaram amigos <EFBFBD>ntimos, tanto
|
||||
quanto podiam s<EFBFBD>-lo dois esp<EFBFBD>ritos diferentes, ou talvez por
|
||||
isso mesmo que o eram. Est<EFBFBD>v<EFBFBD>o, dotado de extrema
|
||||
sensibilidade, e n<EFBFBD>o menor fraqueza de <EFBFBD>nimo, afetuoso e
|
||||
bom, n<EFBFBD>o daquela bondade varonil, que <EFBFBD> apan<EFBFBD>gio de uma alma
|
||||
forte, mas dessa outra bondade mole e de cera, que vai <EFBFBD>
|
||||
merc<EFBFBD> de todas as circunst<EFBFBD>ncias, tinha, al<EFBFBD>m de tudo isso,
|
||||
o infort<EFBFBD>nio de trazer ainda sobre o nariz os <EFBFBD>culos
|
||||
cor-de-rosa de suas virginais ilus<EFBFBD>es. Lu<EFBFBD>s Alves via bem
|
||||
com os olhos da cara. N<EFBFBD>o era mau rapaz, mas tinha o seu
|
||||
gr<EFBFBD>o de ego<EFBFBD>smo, e se n<EFBFBD>o era incapaz de afei<EFBFBD><EFBFBD>es, sabia
|
||||
reg<EFBFBD>-las, moder<EFBFBD>-las, e sobretudo gui<EFBFBD>-las ao seu pr<EFBFBD>prio
|
||||
interesse. Entre estes dois homens travara-se amizade
|
||||
<EFBFBD>ntima, nascida para um na simpatia, para outro no costume.
|
||||
Eram eles os naturais confidentes um do outro, com a
|
||||
diferen<EFBFBD>a que Lu<EFBFBD>s Alves dava menos do que recebia, e, ainda
|
||||
assim, nem tudo o que dava exprimia grande confian<EFBFBD>a.
|
||||
]]
|
||||
|
||||
local function random(handle, io_err)
|
||||
if handle then
|
||||
return function()
|
||||
if not handle then error("source is empty!", 2) end
|
||||
local len = math.random(0, 1024)
|
||||
local chunk = handle:read(len)
|
||||
if not chunk then
|
||||
handle:close()
|
||||
handle = nil
|
||||
end
|
||||
return chunk
|
||||
end
|
||||
else return ltn12.source.empty(io_err or "unable to open file") end
|
||||
end
|
||||
|
||||
|
||||
local function named(f)
|
||||
return f
|
||||
end
|
||||
|
||||
local what = nil
|
||||
local function transform(input, output, filter)
|
||||
local source = random(io.open(input, "rb"))
|
||||
local sink = ltn12.sink.file(io.open(output, "wb"))
|
||||
if what then
|
||||
sink = ltn12.sink.chain(filter, sink)
|
||||
else
|
||||
source = ltn12.source.chain(source, filter)
|
||||
end
|
||||
--what = not what
|
||||
ltn12.pump.all(source, sink)
|
||||
end
|
||||
|
||||
local function encode_qptest(mode)
|
||||
local encode = mime.encode("quoted-printable", mode)
|
||||
local split = mime.wrap("quoted-printable")
|
||||
local chain = ltn12.filter.chain(encode, split)
|
||||
transform(qptest, eqptest, chain)
|
||||
end
|
||||
|
||||
local function compare_qptest()
|
||||
io.write("testing qp encoding and wrap: ")
|
||||
compare(qptest, dqptest)
|
||||
end
|
||||
|
||||
local function decode_qptest()
|
||||
local decode = mime.decode("quoted-printable")
|
||||
transform(eqptest, dqptest, decode)
|
||||
end
|
||||
|
||||
local function create_qptest()
|
||||
local f, err = io.open(qptest, "wb")
|
||||
if not f then fail(err) end
|
||||
-- try all characters
|
||||
for i = 0, 255 do
|
||||
f:write(string.char(i))
|
||||
end
|
||||
-- try all characters and different line sizes
|
||||
for i = 0, 255 do
|
||||
for j = 0, i do
|
||||
f:write(string.char(i))
|
||||
end
|
||||
f:write("\r\n")
|
||||
end
|
||||
-- test latin text
|
||||
f:write(mao)
|
||||
-- force soft line breaks and treatment of space/tab in end of line
|
||||
local tab
|
||||
f:write(string.gsub(mao, "(%s)", function(c)
|
||||
if tab then
|
||||
tab = nil
|
||||
return "\t"
|
||||
else
|
||||
tab = 1
|
||||
return " "
|
||||
end
|
||||
end))
|
||||
-- test crazy end of line conventions
|
||||
local eol = { "\r\n", "\r", "\n", "\n\r" }
|
||||
local which = 0
|
||||
f:write(string.gsub(mao, "(\n)", function(c)
|
||||
which = which + 1
|
||||
if which > 4 then which = 1 end
|
||||
return eol[which]
|
||||
end))
|
||||
for i = 1, 4 do
|
||||
for j = 1, 4 do
|
||||
f:write(eol[i])
|
||||
f:write(eol[j])
|
||||
end
|
||||
end
|
||||
-- try long spaced and tabbed lines
|
||||
f:write("\r\n")
|
||||
for i = 0, 255 do
|
||||
f:write(string.char(9))
|
||||
end
|
||||
f:write("\r\n")
|
||||
for i = 0, 255 do
|
||||
f:write(' ')
|
||||
end
|
||||
f:write("\r\n")
|
||||
for i = 0, 255 do
|
||||
f:write(string.char(9),' ')
|
||||
end
|
||||
f:write("\r\n")
|
||||
for i = 0, 255 do
|
||||
f:write(' ',string.char(32))
|
||||
end
|
||||
f:write("\r\n")
|
||||
|
||||
f:close()
|
||||
end
|
||||
|
||||
local function cleanup_qptest()
|
||||
os.remove(qptest)
|
||||
os.remove(eqptest)
|
||||
os.remove(dqptest)
|
||||
end
|
||||
|
||||
-- create test file
|
||||
local function create_b64test()
|
||||
local f = assert(io.open(b64test, "wb"))
|
||||
local t = {}
|
||||
for j = 1, 100 do
|
||||
for i = 1, 100 do
|
||||
t[i] = math.random(0, 255)
|
||||
end
|
||||
f:write(string.char(unpack(t)))
|
||||
end
|
||||
f:close()
|
||||
end
|
||||
|
||||
local function encode_b64test()
|
||||
local e1 = mime.encode("base64")
|
||||
local e2 = mime.encode("base64")
|
||||
local e3 = mime.encode("base64")
|
||||
local e4 = mime.encode("base64")
|
||||
local sp4 = mime.wrap()
|
||||
local sp3 = mime.wrap(59)
|
||||
local sp2 = mime.wrap("base64", 30)
|
||||
local sp1 = mime.wrap(27)
|
||||
local chain = ltn12.filter.chain(e1, sp1, e2, sp2, e3, sp3, e4, sp4)
|
||||
transform(b64test, eb64test, chain)
|
||||
end
|
||||
|
||||
local function decode_b64test()
|
||||
local d1 = named(mime.decode("base64"), "d1")
|
||||
local d2 = named(mime.decode("base64"), "d2")
|
||||
local d3 = named(mime.decode("base64"), "d3")
|
||||
local d4 = named(mime.decode("base64"), "d4")
|
||||
local chain = named(ltn12.filter.chain(d1, d2, d3, d4), "chain")
|
||||
transform(eb64test, db64test, chain)
|
||||
end
|
||||
|
||||
local function cleanup_b64test()
|
||||
os.remove(b64test)
|
||||
os.remove(eb64test)
|
||||
os.remove(db64test)
|
||||
end
|
||||
|
||||
local function compare_b64test()
|
||||
io.write("testing b64 chained encode: ")
|
||||
compare(b64test, db64test)
|
||||
end
|
||||
|
||||
local function identity_test()
|
||||
io.write("testing identity: ")
|
||||
local chain = named(ltn12.filter.chain(
|
||||
named(mime.encode("quoted-printable"), "1 eq"),
|
||||
named(mime.encode("base64"), "2 eb"),
|
||||
named(mime.decode("base64"), "3 db"),
|
||||
named(mime.decode("quoted-printable"), "4 dq")
|
||||
), "chain")
|
||||
transform(b64test, eb64test, chain)
|
||||
compare(b64test, eb64test)
|
||||
os.remove(eb64test)
|
||||
end
|
||||
|
||||
|
||||
local function padcheck(original, encoded)
|
||||
local e = (mime.b64(original))
|
||||
local d = (mime.unb64(encoded))
|
||||
if e ~= encoded then fail("encoding failed") end
|
||||
if d ~= original then fail("decoding failed") end
|
||||
end
|
||||
|
||||
local function chunkcheck(original, encoded)
|
||||
local len = string.len(original)
|
||||
for i = 0, len do
|
||||
local a = string.sub(original, 1, i)
|
||||
local b = string.sub(original, i+1)
|
||||
local e, r = mime.b64(a, b)
|
||||
local f = (mime.b64(r))
|
||||
if (e .. (f or "") ~= encoded) then fail(e .. (f or "")) end
|
||||
end
|
||||
end
|
||||
|
||||
local function padding_b64test()
|
||||
io.write("testing b64 padding: ")
|
||||
padcheck("a", "YQ==")
|
||||
padcheck("ab", "YWI=")
|
||||
padcheck("abc", "YWJj")
|
||||
padcheck("abcd", "YWJjZA==")
|
||||
padcheck("abcde", "YWJjZGU=")
|
||||
padcheck("abcdef", "YWJjZGVm")
|
||||
padcheck("abcdefg", "YWJjZGVmZw==")
|
||||
padcheck("abcdefgh", "YWJjZGVmZ2g=")
|
||||
padcheck("abcdefghi", "YWJjZGVmZ2hp")
|
||||
padcheck("abcdefghij", "YWJjZGVmZ2hpag==")
|
||||
chunkcheck("abcdefgh", "YWJjZGVmZ2g=")
|
||||
chunkcheck("abcdefghi", "YWJjZGVmZ2hp")
|
||||
chunkcheck("abcdefghij", "YWJjZGVmZ2hpag==")
|
||||
print("ok")
|
||||
end
|
||||
|
||||
local function test_b64lowlevel()
|
||||
io.write("testing b64 low-level: ")
|
||||
local a, b
|
||||
a, b = mime.b64("", "")
|
||||
assert(a == "" and b == "")
|
||||
a, b = mime.b64(nil, "blablabla")
|
||||
assert(a == nil and b == nil)
|
||||
a, b = mime.b64("", nil)
|
||||
assert(a == nil and b == nil)
|
||||
a, b = mime.unb64("", "")
|
||||
assert(a == "" and b == "")
|
||||
a, b = mime.unb64(nil, "blablabla")
|
||||
assert(a == nil and b == nil)
|
||||
a, b = mime.unb64("", nil)
|
||||
assert(a == nil and b == nil)
|
||||
local binary=string.char(0x00,0x44,0x1D,0x14,0x0F,0xF4,0xDA,0x11,0xA9,0x78,0x00,0x14,0x38,0x50,0x60,0xCE)
|
||||
local encoded = mime.b64(binary)
|
||||
local decoded=mime.unb64(encoded)
|
||||
assert(binary == decoded)
|
||||
print("ok")
|
||||
end
|
||||
|
||||
local t = socket.gettime()
|
||||
|
||||
create_b64test()
|
||||
identity_test()
|
||||
encode_b64test()
|
||||
decode_b64test()
|
||||
compare_b64test()
|
||||
cleanup_b64test()
|
||||
padding_b64test()
|
||||
test_b64lowlevel()
|
||||
|
||||
create_qptest()
|
||||
encode_qptest()
|
||||
decode_qptest()
|
||||
compare_qptest()
|
||||
encode_qptest("binary")
|
||||
decode_qptest()
|
||||
compare_qptest()
|
||||
cleanup_qptest()
|
||||
|
||||
|
||||
print(string.format("done in %.2fs", socket.gettime() - t))
|
||||
259
src/deps/src/luasocket/test/smtptest.lua
vendored
259
src/deps/src/luasocket/test/smtptest.lua
vendored
|
|
@ -1,259 +0,0 @@
|
|||
local sent = {}
|
||||
|
||||
local from = "diego@localhost"
|
||||
local server = "localhost"
|
||||
local rcpt = "luasocket@localhost"
|
||||
|
||||
local files = {
|
||||
"/var/spool/mail/luasocket",
|
||||
"/var/spool/mail/luasock1",
|
||||
"/var/spool/mail/luasock2",
|
||||
"/var/spool/mail/luasock3",
|
||||
}
|
||||
|
||||
local t = socket.time()
|
||||
local err
|
||||
|
||||
dofile("mbox.lua")
|
||||
local parse = mbox.parse
|
||||
dofile("testsupport.lua")
|
||||
|
||||
local total = function()
|
||||
local t = 0
|
||||
for i = 1, #sent do
|
||||
t = t + sent[i].count
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
local similar = function(s1, s2)
|
||||
return
|
||||
string.lower(string.gsub(s1, "%s", "")) ==
|
||||
string.lower(string.gsub(s2, "%s", ""))
|
||||
end
|
||||
|
||||
local fail = function(s)
|
||||
s = s or "failed!"
|
||||
print(s)
|
||||
os.exit()
|
||||
end
|
||||
|
||||
local readfile = function(name)
|
||||
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
|
||||
end
|
||||
|
||||
local empty = function()
|
||||
for i,v in ipairs(files) do
|
||||
local f = io.open(v, "w")
|
||||
if not f then
|
||||
fail("unable to open file!")
|
||||
end
|
||||
f:close()
|
||||
end
|
||||
end
|
||||
|
||||
local get = function()
|
||||
local s = ""
|
||||
for i,v in ipairs(files) do
|
||||
s = s .. "\n" .. readfile(v)
|
||||
end
|
||||
return s
|
||||
end
|
||||
|
||||
local check_headers = function(sent, got)
|
||||
sent = sent or {}
|
||||
got = got or {}
|
||||
for i,v in pairs(sent) do
|
||||
if not similar(v, got[i]) then fail("header " .. v .. "failed!") end
|
||||
end
|
||||
end
|
||||
|
||||
local check_body = function(sent, got)
|
||||
sent = sent or ""
|
||||
got = got or ""
|
||||
if not similar(sent, got) then fail("bodies differ!") end
|
||||
end
|
||||
|
||||
local check = function(sent, m)
|
||||
io.write("checking ", m.headers.title, ": ")
|
||||
for i = 1, #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 = #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()
|
||||
return { time = time }
|
||||
end
|
||||
|
||||
local wait = function(sentinel, n)
|
||||
local to
|
||||
io.write("waiting for ", n, " messages: ")
|
||||
while 1 do
|
||||
local mbox = parse(get())
|
||||
if n == #mbox then break end
|
||||
if socket.time() - sentinel.time > 50 then
|
||||
to = 1
|
||||
break
|
||||
end
|
||||
socket.sleep(1)
|
||||
io.write(".")
|
||||
io.stdout:flush()
|
||||
end
|
||||
if to then fail("timeout")
|
||||
else print("ok") end
|
||||
end
|
||||
|
||||
local stuffed_body = [[
|
||||
This message body needs to be
|
||||
stuffed because it has a dot
|
||||
.
|
||||
by itself on a line.
|
||||
Otherwise the mailer would
|
||||
think that the dot
|
||||
.
|
||||
is the end of the message
|
||||
and the remaining text would cause
|
||||
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",
|
||||
})
|
||||
|
||||
insert(sent, {
|
||||
from = from,
|
||||
rcpt = {
|
||||
"luasock2@localhost",
|
||||
"luasock3",
|
||||
"luasock1"
|
||||
},
|
||||
headers = {
|
||||
header1 = "header 1",
|
||||
header2 = "header 2",
|
||||
header3 = "header 3",
|
||||
header4 = "header 4",
|
||||
header5 = "header 5",
|
||||
header6 = "header 6",
|
||||
},
|
||||
body = stuffed_body,
|
||||
title = "complex message",
|
||||
})
|
||||
|
||||
insert(sent, {
|
||||
from = from,
|
||||
rcpt = rcpt,
|
||||
server = server,
|
||||
body = "simple message body",
|
||||
title = "simple message"
|
||||
})
|
||||
|
||||
insert(sent, {
|
||||
from = from,
|
||||
rcpt = rcpt,
|
||||
server = server,
|
||||
body = stuffed_body,
|
||||
title = "stuffed message body"
|
||||
})
|
||||
|
||||
insert(sent, {
|
||||
from = from,
|
||||
rcpt = rcpt,
|
||||
headers = {
|
||||
header1 = "header 1",
|
||||
header2 = "header 2",
|
||||
header3 = "header 3",
|
||||
header4 = "header 4",
|
||||
header5 = "header 5",
|
||||
header6 = "header 6",
|
||||
},
|
||||
title = "multiple headers"
|
||||
})
|
||||
|
||||
insert(sent, {
|
||||
from = from,
|
||||
rcpt = rcpt,
|
||||
title = "minimum message"
|
||||
})
|
||||
|
||||
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"
|
||||
}
|
||||
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,
|
||||
}
|
||||
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,
|
||||
}
|
||||
if ret or not err then fail("wrong error message")
|
||||
else print(err) end
|
||||
|
||||
io.write("clearing mailbox: ")
|
||||
empty()
|
||||
print("ok")
|
||||
|
||||
io.write("sending messages: ")
|
||||
for i = 1, #sent do
|
||||
ret, err = socket.smtp.mail(sent[i])
|
||||
if not ret then fail(err) end
|
||||
io.write("+")
|
||||
io.stdout:flush()
|
||||
end
|
||||
print("ok")
|
||||
|
||||
wait(mark(), total())
|
||||
|
||||
io.write("parsing mailbox: ")
|
||||
local mbox = parse(get())
|
||||
print(#mbox .. " messages found!")
|
||||
|
||||
for i = 1, #mbox do
|
||||
check(sent, mbox[i])
|
||||
end
|
||||
|
||||
print("passed all tests")
|
||||
print(string.format("done in %.2fs", socket.time() - t))
|
||||
21
src/deps/src/luasocket/test/stufftest.lua
vendored
21
src/deps/src/luasocket/test/stufftest.lua
vendored
|
|
@ -1,21 +0,0 @@
|
|||
local mime = require("mime")
|
||||
|
||||
function test_dot(original, right)
|
||||
local result, n = mime.dot(2, original)
|
||||
assert(result == right, "->" .. result .. "<-")
|
||||
print("ok")
|
||||
end
|
||||
|
||||
function test_stuff(original, right)
|
||||
local result, n = mime.dot(2, original)
|
||||
assert(result == right, "->" .. result .. "<-")
|
||||
print("ok")
|
||||
end
|
||||
|
||||
test_dot("abc", "abc")
|
||||
test_dot("", "")
|
||||
test_dot("\r\n", "\r\n")
|
||||
test_dot("\r\n.", "\r\n..")
|
||||
test_dot(".\r\n.", "..\r\n..")
|
||||
test_dot(".\r\n.", "..\r\n..")
|
||||
test_dot("abcd.\r\n.", "abcd.\r\n..")
|
||||
57
src/deps/src/luasocket/test/tcp-getoptions
vendored
57
src/deps/src/luasocket/test/tcp-getoptions
vendored
|
|
@ -1,57 +0,0 @@
|
|||
#!/usr/bin/env lua
|
||||
|
||||
local socket = require"socket"
|
||||
|
||||
port = 8765
|
||||
|
||||
function pcalltest(msg, o, opt)
|
||||
local a = { pcall(o.getoption, o, opt) }
|
||||
if a[1] then
|
||||
print(msg, opt, unpack(a))
|
||||
else
|
||||
print(msg, opt, 'fail: ' .. a[2])
|
||||
end
|
||||
end
|
||||
|
||||
function options(o)
|
||||
print("options for", o)
|
||||
|
||||
for _, opt in ipairs{
|
||||
"keepalive", "reuseaddr",
|
||||
"tcp-nodelay", "tcp-keepidle", "tcp-keepcnt", "tcp-keepintvl"} do
|
||||
pcalltest("getoption", o, opt)
|
||||
end
|
||||
|
||||
r = o:getoption'linger'
|
||||
if r then
|
||||
print("getoption", "linger",
|
||||
"on", r.on,
|
||||
"timeout", r.timeout)
|
||||
else
|
||||
print("getoption", "linger", "no result")
|
||||
end
|
||||
end
|
||||
|
||||
local m = socket.tcp()
|
||||
|
||||
options(m)
|
||||
|
||||
assert(m:bind("*", port))
|
||||
assert(m:listen())
|
||||
|
||||
options(m)
|
||||
|
||||
m:close()
|
||||
|
||||
local m = socket.bind("*", port)
|
||||
|
||||
options(m)
|
||||
|
||||
local c = socket.connect("localhost", port)
|
||||
|
||||
options(c)
|
||||
|
||||
local s = m:accept()
|
||||
|
||||
options(s)
|
||||
|
||||
6
src/deps/src/luasocket/test/test_bind.lua
vendored
6
src/deps/src/luasocket/test/test_bind.lua
vendored
|
|
@ -1,6 +0,0 @@
|
|||
local socket = require "socket"
|
||||
local u = socket.udp() assert(u:setsockname("*", 5088)) u:close()
|
||||
local u = socket.udp() assert(u:setsockname("*", 0)) u:close()
|
||||
local t = socket.tcp() assert(t:bind("*", 5088)) t:close()
|
||||
local t = socket.tcp() assert(t:bind("*", 0)) t:close()
|
||||
print("done!")
|
||||
15
src/deps/src/luasocket/test/test_getaddrinfo.lua
vendored
15
src/deps/src/luasocket/test/test_getaddrinfo.lua
vendored
|
|
@ -1,15 +0,0 @@
|
|||
local socket = require "socket"
|
||||
local addresses = assert(socket.dns.getaddrinfo("localhost"))
|
||||
assert(type(addresses) == 'table')
|
||||
|
||||
local ipv4mask = "^%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?$"
|
||||
|
||||
for i, alt in ipairs(addresses) do
|
||||
if alt.family == 'inet' then
|
||||
assert(type(alt.addr) == 'string')
|
||||
assert(alt.addr:find(ipv4mask))
|
||||
assert(alt.addr == '127.0.0.1')
|
||||
end
|
||||
end
|
||||
|
||||
print("done!")
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
local socket = require "socket"
|
||||
|
||||
local host, port = "127.0.0.1", "5462"
|
||||
|
||||
assert(socket.bind(host, port)):close()
|
||||
|
||||
local sock = socket.tcp()
|
||||
sock:settimeout(0)
|
||||
|
||||
local ok, err = sock:connect(host, port)
|
||||
assert(not ok)
|
||||
assert('timeout' == err)
|
||||
|
||||
for i = 1, 10 do
|
||||
-- select pass even if socket has error
|
||||
local _, rec, err = socket.select(nil, {sock}, 1)
|
||||
local _, ss = next(rec)
|
||||
if ss then
|
||||
assert(ss == sock)
|
||||
else
|
||||
assert('timeout' == err, 'unexpected error :' .. tostring(err))
|
||||
end
|
||||
err = sock:getoption("error") -- i get 'connection refused' on WinXP
|
||||
if err then
|
||||
print("Passed! Error is '" .. err .. "'.")
|
||||
os.exit(0)
|
||||
end
|
||||
end
|
||||
|
||||
print("Fail! No error detected!")
|
||||
os.exit(1)
|
||||
803
src/deps/src/luasocket/test/testclnt.lua
vendored
803
src/deps/src/luasocket/test/testclnt.lua
vendored
|
|
@ -1,803 +0,0 @@
|
|||
local socket = require"socket"
|
||||
|
||||
host = host or "localhost"
|
||||
port = port or "8383"
|
||||
|
||||
function printf(...)
|
||||
io.stderr:write(string.format(...))
|
||||
end
|
||||
|
||||
function pass(...)
|
||||
printf(...)
|
||||
io.stderr:write("\n")
|
||||
end
|
||||
|
||||
function fail(...)
|
||||
io.stderr:write("ERROR: ")
|
||||
printf(...)
|
||||
io.stderr:write("!\n")
|
||||
os.exit()
|
||||
end
|
||||
|
||||
function warn(...)
|
||||
local s = string.format(...)
|
||||
io.stderr:write("WARNING: ", s, "\n")
|
||||
end
|
||||
|
||||
function remote(...)
|
||||
local s = string.format(...)
|
||||
s = string.gsub(s, "\n", ";")
|
||||
s = string.gsub(s, "%s+", " ")
|
||||
s = string.gsub(s, "^%s*", "")
|
||||
control:send(s .. "\n")
|
||||
control:receive()
|
||||
end
|
||||
|
||||
function test(test)
|
||||
io.stderr:write("----------------------------------------------\n",
|
||||
"testing: ", test, "\n",
|
||||
"----------------------------------------------\n")
|
||||
end
|
||||
|
||||
function check_timeout(tm, sl, elapsed, err, opp, mode, alldone)
|
||||
if tm < sl then
|
||||
if opp == "send" then
|
||||
if not err then warn("must be buffered")
|
||||
elseif err == "timeout" then pass("proper timeout")
|
||||
else fail("unexpected error '%s'", err) end
|
||||
else
|
||||
if err ~= "timeout" then fail("should have timed out")
|
||||
else pass("proper timeout") end
|
||||
end
|
||||
else
|
||||
if mode == "total" then
|
||||
if elapsed > tm then
|
||||
if err ~= "timeout" then fail("should have timed out")
|
||||
else pass("proper timeout") end
|
||||
elseif elapsed < tm then
|
||||
if err then fail(err)
|
||||
else pass("ok") end
|
||||
else
|
||||
if alldone then
|
||||
if err then fail("unexpected error '%s'", err)
|
||||
else pass("ok") end
|
||||
else
|
||||
if err ~= "timeout" then fail(err)
|
||||
else pass("proper timeoutk") end
|
||||
end
|
||||
end
|
||||
else
|
||||
if err then fail(err)
|
||||
else pass("ok") end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not socket._DEBUG then
|
||||
fail("Please define LUASOCKET_DEBUG and recompile LuaSocket")
|
||||
end
|
||||
|
||||
io.stderr:write("----------------------------------------------\n",
|
||||
"LuaSocket Test Procedures\n",
|
||||
"----------------------------------------------\n")
|
||||
|
||||
start = socket.gettime()
|
||||
|
||||
function reconnect()
|
||||
if data then data:close() end
|
||||
remote [[
|
||||
if data then data:close() data = nil end
|
||||
data = server:accept()
|
||||
data:setoption("tcp-nodelay", true)
|
||||
]]
|
||||
data, err = socket.connect(host, port)
|
||||
if not data then fail(err) end
|
||||
data:setoption("tcp-nodelay", true)
|
||||
end
|
||||
|
||||
printf("attempting control connection...")
|
||||
control, err = socket.connect(host, port)
|
||||
if err then fail(err)
|
||||
else pass("connected!") end
|
||||
control:setoption("tcp-nodelay", true)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_methods(sock, methods)
|
||||
for _, v in pairs(methods) do
|
||||
if type(sock[v]) ~= "function" then
|
||||
fail(sock.class .. " method '" .. v .. "' not registered")
|
||||
end
|
||||
end
|
||||
pass(sock.class .. " methods are ok")
|
||||
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"
|
||||
local p3 = "raw " .. string.rep("z", inter) .. "bytes"
|
||||
local p4 = "end" .. string.rep("w", inter) .. "bytes"
|
||||
local bp1, bp2, bp3, bp4
|
||||
remote (string.format("str = data:receive(%d)",
|
||||
string.len(p1)+string.len(p2)+string.len(p3)+string.len(p4)))
|
||||
sent, err = data:send(p1..p2..p3..p4)
|
||||
if err then fail(err) end
|
||||
remote "data:send(str); data:close()"
|
||||
bp1, err = data:receive()
|
||||
if err then fail(err) end
|
||||
bp2, err = data:receive()
|
||||
if err then fail(err) end
|
||||
bp3, err = data:receive(string.len(p3))
|
||||
if err then fail(err) end
|
||||
bp4, err = data:receive("*a")
|
||||
if err then fail(err) end
|
||||
if bp1.."\n" == p1 and bp2.."\r\n" == p2 and bp3 == p3 and bp4 == p4 then
|
||||
pass("patterns match")
|
||||
else fail("patterns don't match") end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
if not math.mod then
|
||||
math.mod = math.fmod
|
||||
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))
|
||||
str = str .. str10
|
||||
remote "str = data:receive()"
|
||||
sent, err = data:send(str.."\n")
|
||||
if err then fail(err) end
|
||||
remote "data:send(str ..'\\n')"
|
||||
back, err = data:receive()
|
||||
if err then fail(err) end
|
||||
if back == str then pass("lines match")
|
||||
else fail("lines don't match") end
|
||||
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),
|
||||
math.floor(len/10))
|
||||
str = str .. str10
|
||||
remote "str = data:receive()"
|
||||
sent, err = data:send(str.."\n")
|
||||
if err then fail(err) end
|
||||
remote "data:send(str..'\\n')"
|
||||
back, err = data:receive()
|
||||
if err then fail(err) end
|
||||
if back == str then pass("lines match")
|
||||
else fail("lines don't match") end
|
||||
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)
|
||||
s2 = string.rep("y", len-half)
|
||||
remote (string.format("str = data:receive(%d)", len))
|
||||
sent, err = data:send(s1)
|
||||
if err then fail(err) end
|
||||
sent, err = data:send(s2)
|
||||
if err then fail(err) end
|
||||
remote "data:send(str)"
|
||||
back, err = data:receive(len)
|
||||
if err then fail(err) end
|
||||
if back == s1..s2 then pass("blocks match")
|
||||
else fail("blocks don't match") end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_totaltimeoutreceive(len, tm, sl)
|
||||
reconnect()
|
||||
local str, err, partial
|
||||
printf("%d bytes, %ds total timeout, %ds pause: ", len, tm, sl)
|
||||
remote (string.format ([[
|
||||
data:settimeout(%d)
|
||||
str = string.rep('a', %d)
|
||||
data:send(str)
|
||||
print('server: sleeping for %ds')
|
||||
socket.sleep(%d)
|
||||
print('server: woke up')
|
||||
data:send(str)
|
||||
]], 2*tm, len, sl, sl))
|
||||
data:settimeout(tm, "total")
|
||||
local t = socket.gettime()
|
||||
str, err, partial, elapsed = data:receive(2*len)
|
||||
check_timeout(tm, sl, elapsed, err, "receive", "total",
|
||||
string.len(str or partial) == 2*len)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_totaltimeoutsend(len, tm, sl)
|
||||
reconnect()
|
||||
local str, err, total
|
||||
printf("%d bytes, %ds total timeout, %ds pause: ", len, tm, sl)
|
||||
remote (string.format ([[
|
||||
data:settimeout(%d)
|
||||
str = data:receive(%d)
|
||||
print('server: sleeping for %ds')
|
||||
socket.sleep(%d)
|
||||
print('server: woke up')
|
||||
str = data:receive(%d)
|
||||
]], 2*tm, len, sl, sl, len))
|
||||
data:settimeout(tm, "total")
|
||||
str = string.rep("a", 2*len)
|
||||
total, err, partial, elapsed = data:send(str)
|
||||
check_timeout(tm, sl, elapsed, err, "send", "total",
|
||||
total == 2*len)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_blockingtimeoutreceive(len, tm, sl)
|
||||
reconnect()
|
||||
local str, err, partial
|
||||
printf("%d bytes, %ds blocking timeout, %ds pause: ", len, tm, sl)
|
||||
remote (string.format ([[
|
||||
data:settimeout(%d)
|
||||
str = string.rep('a', %d)
|
||||
data:send(str)
|
||||
print('server: sleeping for %ds')
|
||||
socket.sleep(%d)
|
||||
print('server: woke up')
|
||||
data:send(str)
|
||||
]], 2*tm, len, sl, sl))
|
||||
data:settimeout(tm)
|
||||
str, err, partial, elapsed = data:receive(2*len)
|
||||
check_timeout(tm, sl, elapsed, err, "receive", "blocking",
|
||||
string.len(str or partial) == 2*len)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_blockingtimeoutsend(len, tm, sl)
|
||||
reconnect()
|
||||
local str, err, total
|
||||
printf("%d bytes, %ds blocking timeout, %ds pause: ", len, tm, sl)
|
||||
remote (string.format ([[
|
||||
data:settimeout(%d)
|
||||
str = data:receive(%d)
|
||||
print('server: sleeping for %ds')
|
||||
socket.sleep(%d)
|
||||
print('server: woke up')
|
||||
str = data:receive(%d)
|
||||
]], 2*tm, len, sl, sl, len))
|
||||
data:settimeout(tm)
|
||||
str = string.rep("a", 2*len)
|
||||
total, err, partial, elapsed = data:send(str)
|
||||
check_timeout(tm, sl, elapsed, err, "send", "blocking",
|
||||
total == 2*len)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function empty_connect()
|
||||
printf("empty connect: ")
|
||||
reconnect()
|
||||
if data then data:close() data = nil end
|
||||
remote [[
|
||||
if data then data:close() data = nil end
|
||||
data = server:accept()
|
||||
]]
|
||||
data, err = socket.connect("", port)
|
||||
if not data then
|
||||
pass("ok")
|
||||
data = socket.connect(host, port)
|
||||
else
|
||||
pass("gethostbyname returns localhost on empty string...")
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function isclosed(c)
|
||||
return c:getfd() == -1 or c:getfd() == (2^32-1)
|
||||
end
|
||||
|
||||
function active_close()
|
||||
local tcp = socket.tcp4()
|
||||
if isclosed(tcp) then fail("should not be closed") end
|
||||
tcp:close()
|
||||
if not isclosed(tcp) then fail("should be closed") end
|
||||
tcp = socket.tcp()
|
||||
if not isclosed(tcp) then fail("should be closed") end
|
||||
tcp = nil
|
||||
local udp = socket.udp4()
|
||||
if isclosed(udp) then fail("should not be closed") end
|
||||
udp:close()
|
||||
if not isclosed(udp) then fail("should be closed") end
|
||||
udp = socket.udp()
|
||||
if not isclosed(udp) then fail("should be closed") end
|
||||
udp = nil
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_closed()
|
||||
local back, partial, err
|
||||
local str = 'little string'
|
||||
reconnect()
|
||||
printf("trying read detection: ")
|
||||
remote (string.format ([[
|
||||
data:send('%s')
|
||||
data:close()
|
||||
data = nil
|
||||
]], str))
|
||||
-- try to get a line
|
||||
back, err, partial = data:receive()
|
||||
if not err then fail("should have gotten 'closed'.")
|
||||
elseif err ~= "closed" then fail("got '"..err.."' instead of 'closed'.")
|
||||
elseif str ~= partial then fail("didn't receive partial result.")
|
||||
else pass("graceful 'closed' received") end
|
||||
reconnect()
|
||||
printf("trying write detection: ")
|
||||
remote [[
|
||||
data:close()
|
||||
data = nil
|
||||
]]
|
||||
total, err, partial = data:send(string.rep("ugauga", 100000))
|
||||
if not err then
|
||||
pass("failed: output buffer is at least %d bytes long!", total)
|
||||
elseif err ~= "closed" then
|
||||
fail("got '"..err.."' instead of 'closed'.")
|
||||
else
|
||||
pass("graceful 'closed' received after %d bytes were sent", partial)
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_selectbugs()
|
||||
local r, s, e = socket.select(nil, nil, 0.1)
|
||||
assert(type(r) == "table" and type(s) == "table" and
|
||||
(e == "timeout" or e == "error"))
|
||||
pass("both nil: ok")
|
||||
local udp = socket.udp()
|
||||
udp:close()
|
||||
r, s, e = socket.select({ udp }, { udp }, 0.1)
|
||||
assert(type(r) == "table" and type(s) == "table" and
|
||||
(e == "timeout" or e == "error"))
|
||||
pass("closed sockets: ok")
|
||||
e = pcall(socket.select, "wrong", 1, 0.1)
|
||||
assert(e == false, tostring(e))
|
||||
e = pcall(socket.select, {}, 1, 0.1)
|
||||
assert(e == false, tostring(e))
|
||||
pass("invalid input: ok")
|
||||
local toomany = {}
|
||||
for i = 1, socket._SETSIZE+1 do
|
||||
toomany[#toomany+1] = socket.udp4()
|
||||
end
|
||||
if #toomany > socket._SETSIZE then
|
||||
local e = pcall(socket.select, toomany, nil, 0.1)
|
||||
assert(e == false, tostring(e))
|
||||
pass("too many sockets (" .. #toomany .. "): ok")
|
||||
else
|
||||
pass("unable to create enough sockets (max was "..#toomany..")")
|
||||
pass("try using ulimit")
|
||||
end
|
||||
for _, c in ipairs(toomany) do c:close() end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function accept_timeout()
|
||||
printf("accept with timeout (if it hangs, it failed): ")
|
||||
local s, e = socket.bind("*", 0, 0)
|
||||
assert(s, e)
|
||||
local t = socket.gettime()
|
||||
s:settimeout(1)
|
||||
local c, e = s:accept()
|
||||
assert(not c, "should not accept")
|
||||
assert(e == "timeout", string.format("wrong error message (%s)", e))
|
||||
t = socket.gettime() - t
|
||||
assert(t < 2, string.format("took to long to give up (%gs)", t))
|
||||
s:close()
|
||||
pass("good")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function connect_timeout()
|
||||
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)
|
||||
assert(not r, "should not connect")
|
||||
assert(socket.gettime() - t < 2, "took too long to give up.")
|
||||
c:close()
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function accept_errors()
|
||||
printf("not listening: ")
|
||||
local d, e = socket.bind("*", 0)
|
||||
assert(d, e);
|
||||
local c, e = socket.tcp();
|
||||
assert(c, e);
|
||||
d:setfd(c:getfd())
|
||||
d:settimeout(2)
|
||||
local r, e = d:accept()
|
||||
assert(not r and e)
|
||||
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)
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function connect_errors()
|
||||
printf("connection refused: ")
|
||||
local c, e = socket.connect("localhost", 1);
|
||||
assert(not c and e)
|
||||
pass("ok")
|
||||
printf("host not found: ")
|
||||
local c, e = socket.connect("host.is.invalid", 1);
|
||||
assert(not c and e, e)
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function rebind_test()
|
||||
local c ,c1 = socket.bind("127.0.0.1", 0)
|
||||
if not c then pass ("failed to bind! " .. tostring(c) .. ' ' .. tostring(c1)) return end
|
||||
assert(c,c1)
|
||||
local i, p = c:getsockname()
|
||||
local s, e = socket.tcp()
|
||||
assert(s, e)
|
||||
s:setoption("reuseaddr", false)
|
||||
r, e = s:bind(i, p)
|
||||
assert(not r, "managed to rebind!")
|
||||
assert(e)
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function getstats_test()
|
||||
reconnect()
|
||||
local t = 0
|
||||
for i = 1, 25 do
|
||||
local c = math.random(1, 100)
|
||||
remote (string.format ([[
|
||||
str = data:receive(%d)
|
||||
data:send(str)
|
||||
]], c))
|
||||
data:send(string.rep("a", c))
|
||||
data:receive(c)
|
||||
t = t + c
|
||||
local r, s, a = data:getstats()
|
||||
assert(r == t, "received count failed" .. tostring(r)
|
||||
.. "/" .. tostring(t))
|
||||
assert(s == t, "sent count failed" .. tostring(s)
|
||||
.. "/" .. tostring(t))
|
||||
end
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_nonblocking(size)
|
||||
reconnect()
|
||||
printf("testing " .. 2*size .. " bytes: ")
|
||||
remote(string.format([[
|
||||
data:send(string.rep("a", %d))
|
||||
socket.sleep(0.5)
|
||||
data:send(string.rep("b", %d) .. "\n")
|
||||
]], size, size))
|
||||
local err = "timeout"
|
||||
local part = ""
|
||||
local str
|
||||
data:settimeout(0)
|
||||
while 1 do
|
||||
str, err, part = data:receive("*l", part)
|
||||
if err ~= "timeout" then break end
|
||||
end
|
||||
assert(str == (string.rep("a", size) .. string.rep("b", size)))
|
||||
reconnect()
|
||||
remote(string.format([[
|
||||
str = data:receive(%d)
|
||||
socket.sleep(0.5)
|
||||
str = data:receive(2*%d, str)
|
||||
data:send(str)
|
||||
]], size, size))
|
||||
data:settimeout(0)
|
||||
local start = 0
|
||||
while 1 do
|
||||
ret, err, start = data:send(str, start+1)
|
||||
if err ~= "timeout" then break end
|
||||
end
|
||||
data:send("\n")
|
||||
data:settimeout(-1)
|
||||
local back = data:receive(2*size)
|
||||
assert(back == str, "'" .. back .. "' vs '" .. str .. "'")
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_readafterclose()
|
||||
local back, partial, err
|
||||
local str = 'little string'
|
||||
reconnect()
|
||||
printf("trying repeated '*a' pattern")
|
||||
remote (string.format ([[
|
||||
data:send('%s')
|
||||
data:close()
|
||||
data = nil
|
||||
]], str))
|
||||
back, err, partial = data:receive("*a")
|
||||
assert(back == str, "unexpected data read")
|
||||
back, err, partial = data:receive("*a")
|
||||
assert(back == nil and err == "closed", "should have returned 'closed'")
|
||||
pass("ok")
|
||||
reconnect()
|
||||
printf("trying active close before '*a'")
|
||||
remote (string.format ([[
|
||||
data:close()
|
||||
data = nil
|
||||
]]))
|
||||
data:close()
|
||||
back, err, partial = data:receive("*a")
|
||||
assert(back == nil and err == "closed", "should have returned 'closed'")
|
||||
pass("ok")
|
||||
reconnect()
|
||||
printf("trying active close before '*l'")
|
||||
remote (string.format ([[
|
||||
data:close()
|
||||
data = nil
|
||||
]]))
|
||||
data:close()
|
||||
back, err, partial = data:receive()
|
||||
assert(back == nil and err == "closed", "should have returned 'closed'")
|
||||
pass("ok")
|
||||
reconnect()
|
||||
printf("trying active close before raw 1")
|
||||
remote (string.format ([[
|
||||
data:close()
|
||||
data = nil
|
||||
]]))
|
||||
data:close()
|
||||
back, err, partial = data:receive(1)
|
||||
assert(back == nil and err == "closed", "should have returned 'closed'")
|
||||
pass("ok")
|
||||
reconnect()
|
||||
printf("trying active close before raw 0")
|
||||
remote (string.format ([[
|
||||
data:close()
|
||||
data = nil
|
||||
]]))
|
||||
data:close()
|
||||
back, err, partial = data:receive(0)
|
||||
assert(back == nil and err == "closed", "should have returned 'closed'")
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_writeafterclose()
|
||||
local str = 'little string'
|
||||
reconnect()
|
||||
remote (string.format ([[
|
||||
data:close()
|
||||
data = nil
|
||||
]]))
|
||||
local sent, err, errsent
|
||||
while not err do
|
||||
sent, err, errsent, time = data:send(str)
|
||||
end
|
||||
assert(err == "closed", "got " .. err .. " instead of 'closed'")
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
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")
|
||||
|
||||
local tcp_methods = {
|
||||
"accept",
|
||||
"bind",
|
||||
"close",
|
||||
"connect",
|
||||
"dirty",
|
||||
"getfamily",
|
||||
"getfd",
|
||||
"getoption",
|
||||
"getpeername",
|
||||
"getsockname",
|
||||
"getstats",
|
||||
"setstats",
|
||||
"listen",
|
||||
"receive",
|
||||
"send",
|
||||
"setfd",
|
||||
"setoption",
|
||||
"setpeername",
|
||||
"setsockname",
|
||||
"settimeout",
|
||||
"shutdown",
|
||||
}
|
||||
test_methods(socket.tcp(), tcp_methods)
|
||||
do local sock = socket.tcp6()
|
||||
if sock then test_methods(socket.tcp6(), tcp_methods)
|
||||
else io.stderr:write("Warning! IPv6 does not support!\n") end
|
||||
end
|
||||
|
||||
local udp_methods = {
|
||||
"close",
|
||||
"dirty",
|
||||
"getfamily",
|
||||
"getfd",
|
||||
"getoption",
|
||||
"getpeername",
|
||||
"getsockname",
|
||||
"receive",
|
||||
"receivefrom",
|
||||
"send",
|
||||
"sendto",
|
||||
"setfd",
|
||||
"setoption",
|
||||
"setpeername",
|
||||
"setsockname",
|
||||
"settimeout"
|
||||
}
|
||||
|
||||
------------------------------------------------------------------------
|
||||
test_methods(socket.udp(), udp_methods)
|
||||
do local sock = socket.tcp6()
|
||||
if sock then test_methods(socket.udp6(), udp_methods)
|
||||
else io.stderr:write("Warning! IPv6 does not support!\n") end
|
||||
end
|
||||
|
||||
test("closed connection detection: ")
|
||||
test_closed()
|
||||
|
||||
test("partial receive")
|
||||
test_partialrecv()
|
||||
|
||||
test("select function")
|
||||
test_selectbugs()
|
||||
|
||||
test("read after close")
|
||||
test_readafterclose()
|
||||
|
||||
test("write after close")
|
||||
test_writeafterclose()
|
||||
|
||||
test("connect function")
|
||||
connect_timeout()
|
||||
empty_connect()
|
||||
connect_errors()
|
||||
|
||||
test("rebinding: ")
|
||||
rebind_test()
|
||||
|
||||
test("active close: ")
|
||||
active_close()
|
||||
|
||||
test("accept function: ")
|
||||
accept_timeout()
|
||||
accept_errors()
|
||||
|
||||
test("getstats test")
|
||||
getstats_test()
|
||||
|
||||
test("character line")
|
||||
test_asciiline(1)
|
||||
test_asciiline(17)
|
||||
test_asciiline(200)
|
||||
test_asciiline(4091)
|
||||
test_asciiline(80199)
|
||||
test_asciiline(8000000)
|
||||
test_asciiline(80199)
|
||||
test_asciiline(4091)
|
||||
test_asciiline(200)
|
||||
test_asciiline(17)
|
||||
test_asciiline(1)
|
||||
|
||||
test("mixed patterns")
|
||||
test_mixed(1)
|
||||
test_mixed(17)
|
||||
test_mixed(200)
|
||||
test_mixed(4091)
|
||||
test_mixed(801990)
|
||||
test_mixed(4091)
|
||||
test_mixed(200)
|
||||
test_mixed(17)
|
||||
test_mixed(1)
|
||||
|
||||
test("binary line")
|
||||
test_rawline(1)
|
||||
test_rawline(17)
|
||||
test_rawline(200)
|
||||
test_rawline(4091)
|
||||
test_rawline(80199)
|
||||
test_rawline(8000000)
|
||||
test_rawline(80199)
|
||||
test_rawline(4091)
|
||||
test_rawline(200)
|
||||
test_rawline(17)
|
||||
test_rawline(1)
|
||||
|
||||
test("raw transfer")
|
||||
test_raw(1)
|
||||
test_raw(17)
|
||||
test_raw(200)
|
||||
test_raw(4091)
|
||||
test_raw(80199)
|
||||
test_raw(8000000)
|
||||
test_raw(80199)
|
||||
test_raw(4091)
|
||||
test_raw(200)
|
||||
test_raw(17)
|
||||
test_raw(1)
|
||||
|
||||
test("non-blocking transfer")
|
||||
test_nonblocking(1)
|
||||
test_nonblocking(17)
|
||||
test_nonblocking(200)
|
||||
test_nonblocking(4091)
|
||||
test_nonblocking(80199)
|
||||
test_nonblocking(800000)
|
||||
test_nonblocking(80199)
|
||||
test_nonblocking(4091)
|
||||
test_nonblocking(200)
|
||||
test_nonblocking(17)
|
||||
test_nonblocking(1)
|
||||
|
||||
test("total timeout on send")
|
||||
test_totaltimeoutsend(800091, 1, 3)
|
||||
test_totaltimeoutsend(800091, 2, 3)
|
||||
test_totaltimeoutsend(800091, 5, 2)
|
||||
test_totaltimeoutsend(800091, 3, 1)
|
||||
|
||||
test("total timeout on receive")
|
||||
test_totaltimeoutreceive(800091, 1, 3)
|
||||
test_totaltimeoutreceive(800091, 2, 3)
|
||||
test_totaltimeoutreceive(800091, 3, 2)
|
||||
test_totaltimeoutreceive(800091, 3, 1)
|
||||
|
||||
test("blocking timeout on send")
|
||||
test_blockingtimeoutsend(800091, 1, 3)
|
||||
test_blockingtimeoutsend(800091, 2, 3)
|
||||
test_blockingtimeoutsend(800091, 3, 2)
|
||||
test_blockingtimeoutsend(800091, 3, 1)
|
||||
|
||||
test("blocking timeout on receive")
|
||||
test_blockingtimeoutreceive(800091, 1, 3)
|
||||
test_blockingtimeoutreceive(800091, 2, 3)
|
||||
test_blockingtimeoutreceive(800091, 3, 2)
|
||||
test_blockingtimeoutreceive(800091, 3, 1)
|
||||
|
||||
test("shutting server down")
|
||||
reconnect()
|
||||
remote("os.exit()")
|
||||
|
||||
test(string.format("done in %.2fs", socket.gettime() - start))
|
||||
96
src/deps/src/luasocket/test/testmesg.lua
vendored
96
src/deps/src/luasocket/test/testmesg.lua
vendored
|
|
@ -1,96 +0,0 @@
|
|||
-- load the smtp support and its friends
|
||||
local smtp = require("socket.smtp")
|
||||
local mime = require("mime")
|
||||
local ltn12 = require("ltn12")
|
||||
|
||||
function filter(s)
|
||||
if s then io.write(s) end
|
||||
return s
|
||||
end
|
||||
|
||||
source = smtp.message {
|
||||
headers = { ['content-type'] = 'multipart/alternative' },
|
||||
body = {
|
||||
[1] = {
|
||||
headers = { ['Content-type'] = 'text/html' },
|
||||
body = "<html> <body> Hi, <b>there</b>...</body> </html>"
|
||||
},
|
||||
[2] = {
|
||||
headers = { ['content-type'] = 'text/plain' },
|
||||
body = "Hi, there..."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
r, e = smtp.send{
|
||||
rcpt = {"<diego@tecgraf.puc-rio.br>",
|
||||
"<diego@princeton.edu>" },
|
||||
from = "<diego@princeton.edu>",
|
||||
source = ltn12.source.chain(source, filter),
|
||||
--server = "mail.cs.princeton.edu"
|
||||
server = "localhost",
|
||||
port = 2525
|
||||
}
|
||||
|
||||
print(r, e)
|
||||
|
||||
-- creates a source to send a message with two parts. The first part is
|
||||
-- plain text, the second part is a PNG image, encoded as base64.
|
||||
source = smtp.message{
|
||||
headers = {
|
||||
-- Remember that headers are *ignored* by smtp.send.
|
||||
from = "Sicrano <sicrano@tecgraf.puc-rio.br>",
|
||||
to = "Fulano <fulano@tecgraf.puc-rio.br>",
|
||||
subject = "Here is a message with attachments"
|
||||
},
|
||||
body = {
|
||||
preamble = "If your client doesn't understand attachments, \r\n" ..
|
||||
"it will still display the preamble and the epilogue.\r\n" ..
|
||||
"Preamble might show up even in a MIME enabled client.",
|
||||
-- first part: No headers means plain text, us-ascii.
|
||||
-- The mime.eol low-level filter normalizes end-of-line markers.
|
||||
[1] = {
|
||||
body = mime.eol(0, [[
|
||||
Lines in a message body should always end with CRLF.
|
||||
The smtp module will *NOT* perform translation. It will
|
||||
perform necessary stuffing, though.
|
||||
]])
|
||||
},
|
||||
-- second part: Headers describe content the to be an image,
|
||||
-- sent under the base64 transfer content encoding.
|
||||
-- Notice that nothing happens until the message is sent. Small
|
||||
-- chunks are loaded into memory and translation happens on the fly.
|
||||
[2] = {
|
||||
headers = {
|
||||
["ConTenT-tYpE"] = 'image/png; name="luasocket.png"',
|
||||
["content-disposition"] = 'attachment; filename="luasocket.png"',
|
||||
["content-description"] = 'our logo',
|
||||
["content-transfer-encoding"] = "BASE64"
|
||||
},
|
||||
body = ltn12.source.chain(
|
||||
ltn12.source.file(io.open("luasocket.png", "rb")),
|
||||
ltn12.filter.chain(
|
||||
mime.encode("base64"),
|
||||
mime.wrap()
|
||||
)
|
||||
)
|
||||
},
|
||||
epilogue = "This might also show up, but after the attachments"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
r, e = smtp.send{
|
||||
rcpt = {"<diego@tecgraf.puc-rio.br>",
|
||||
"<diego@princeton.edu>" },
|
||||
from = "<diego@princeton.edu>",
|
||||
source = ltn12.source.chain(source, filter),
|
||||
--server = "mail.cs.princeton.edu",
|
||||
--port = 25
|
||||
server = "localhost",
|
||||
port = 2525
|
||||
}
|
||||
|
||||
print(r, e)
|
||||
|
||||
|
||||
20
src/deps/src/luasocket/test/testsrvr.lua
vendored
20
src/deps/src/luasocket/test/testsrvr.lua
vendored
|
|
@ -1,20 +0,0 @@
|
|||
socket = require("socket");
|
||||
host = host or "localhost";
|
||||
port = port or "8383";
|
||||
server = assert(socket.bind(host, port));
|
||||
ack = "\n";
|
||||
while 1 do
|
||||
print("server: waiting for client connection...");
|
||||
control = assert(server:accept());
|
||||
while 1 do
|
||||
command, emsg = control:receive();
|
||||
if emsg == "closed" then
|
||||
control:close()
|
||||
break
|
||||
end
|
||||
assert(command, emsg)
|
||||
assert(control:send(ack));
|
||||
print(command);
|
||||
((loadstring or load)(command))();
|
||||
end
|
||||
end
|
||||
37
src/deps/src/luasocket/test/testsupport.lua
vendored
37
src/deps/src/luasocket/test/testsupport.lua
vendored
|
|
@ -1,37 +0,0 @@
|
|||
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
|
||||
end
|
||||
|
||||
function similar(s1, s2)
|
||||
return string.lower(string.gsub(s1 or "", "%s", "")) ==
|
||||
string.lower(string.gsub(s2 or "", "%s", ""))
|
||||
end
|
||||
|
||||
function fail(msg)
|
||||
msg = msg or "failed"
|
||||
error(msg, 2)
|
||||
end
|
||||
|
||||
function compare(input, output)
|
||||
local original = readfile(input)
|
||||
local recovered = readfile(output)
|
||||
if original ~= recovered then fail("comparison failed")
|
||||
else print("ok") end
|
||||
end
|
||||
|
||||
local G = _G
|
||||
local set = rawset
|
||||
local warn = print
|
||||
|
||||
local setglobal = function(table, key, value)
|
||||
warn("changed " .. key)
|
||||
set(table, key, value)
|
||||
end
|
||||
|
||||
setmetatable(G, {
|
||||
__newindex = setglobal
|
||||
})
|
||||
20
src/deps/src/luasocket/test/tftptest.lua
vendored
20
src/deps/src/luasocket/test/tftptest.lua
vendored
|
|
@ -1,20 +0,0 @@
|
|||
-- load tftpclnt.lua
|
||||
local tftp = require("socket.tftp")
|
||||
|
||||
-- needs tftp server running on localhost, with root pointing to
|
||||
-- a directory with index.html in it
|
||||
|
||||
function readfile(file)
|
||||
local f = io.open(file, "r")
|
||||
if not f then return nil end
|
||||
local a = f:read("*a")
|
||||
f:close()
|
||||
return a
|
||||
end
|
||||
|
||||
host = host or "diego.student.princeton.edu"
|
||||
retrieved, err = tftp.get("tftp://" .. host .."/index.html")
|
||||
assert(not err, err)
|
||||
original = readfile("test/index.html")
|
||||
assert(original == retrieved, "files differ!")
|
||||
print("passed")
|
||||
25
src/deps/src/luasocket/test/udp-zero-length-send
vendored
25
src/deps/src/luasocket/test/udp-zero-length-send
vendored
|
|
@ -1,25 +0,0 @@
|
|||
#!/usr/bin/env lua
|
||||
|
||||
--[[
|
||||
Show that luasocket returns an error message on zero-length UDP sends,
|
||||
even though the send is valid, and in fact the UDP packet is sent
|
||||
to the peer:
|
||||
|
||||
% sudo tcpdump -i lo -n
|
||||
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
|
||||
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
|
||||
13:40:16.652808 IP 127.0.0.1.56573 > 127.0.0.1.5432: UDP, length 0
|
||||
|
||||
]]
|
||||
|
||||
socket = require"socket"
|
||||
|
||||
s = assert(socket.udp())
|
||||
r = assert(socket.udp())
|
||||
assert(r:setsockname("*", 5432))
|
||||
assert(s:setpeername("127.0.0.1", 5432))
|
||||
|
||||
ssz, emsg = s:send("")
|
||||
|
||||
print(ssz == 0 and "OK" or "FAIL",[[send:("")]], ssz, emsg)
|
||||
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
#!/usr/bin/env lua
|
||||
|
||||
--[[
|
||||
Show that luasocket returns an error message on zero-length UDP sends,
|
||||
even though the send is valid, and in fact the UDP packet is sent
|
||||
to the peer:
|
||||
|
||||
% sudo tcpdump -i lo -n
|
||||
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
|
||||
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
|
||||
13:40:16.652808 IP 127.0.0.1.56573 > 127.0.0.1.5432: UDP, length 0
|
||||
|
||||
]]
|
||||
|
||||
socket = require"socket"
|
||||
|
||||
s = assert(socket.udp())
|
||||
r = assert(socket.udp())
|
||||
assert(r:setsockname("*", 5432))
|
||||
assert(s:setpeername("127.0.0.1", 5432))
|
||||
|
||||
ok, emsg = s:send("")
|
||||
if ok ~= 0 then
|
||||
print("send of zero failed with:", ok, emsg)
|
||||
end
|
||||
|
||||
assert(r:settimeout(2))
|
||||
|
||||
ok, emsg = r:receive()
|
||||
|
||||
if not ok or string.len(ok) ~= 0 then
|
||||
print("fail - receive of zero failed with:", ok, emsg)
|
||||
os.exit(1)
|
||||
end
|
||||
|
||||
print"ok"
|
||||
|
||||
19
src/deps/src/luasocket/test/udpconnectclnt.lua
vendored
19
src/deps/src/luasocket/test/udpconnectclnt.lua
vendored
|
|
@ -1,19 +0,0 @@
|
|||
local socket = require"socket"
|
||||
local udp = socket.udp
|
||||
local localhost = "127.0.0.1"
|
||||
local port = assert(arg[1], "missing port argument")
|
||||
|
||||
se = udp(); se:setoption("reuseaddr", true)
|
||||
se:setsockname(localhost, 5062)
|
||||
print("se", se:getsockname())
|
||||
sc = udp(); sc:setoption("reuseaddr", true)
|
||||
sc:setsockname(localhost, 5061)
|
||||
print("sc", sc:getsockname())
|
||||
|
||||
se:sendto("this is a test from se", localhost, port)
|
||||
socket.sleep(1)
|
||||
sc:sendto("this is a test from sc", localhost, port)
|
||||
socket.sleep(1)
|
||||
se:sendto("this is a test from se", localhost, port)
|
||||
socket.sleep(1)
|
||||
sc:sendto("this is a test from sc", localhost, port)
|
||||
16
src/deps/src/luasocket/test/udpconnectsrvr.lua
vendored
16
src/deps/src/luasocket/test/udpconnectsrvr.lua
vendored
|
|
@ -1,16 +0,0 @@
|
|||
local socket = require"socket"
|
||||
local udp = socket.udp
|
||||
local localhost = "127.0.0.1"
|
||||
local s = assert(udp())
|
||||
assert(tostring(s):find("udp{unconnected}"))
|
||||
print("setpeername", s:setpeername(localhost, 5061))
|
||||
print("getsockname", s:getsockname())
|
||||
assert(tostring(s):find("udp{connected}"))
|
||||
print(s:receive())
|
||||
print("setpeername", s:setpeername("*"))
|
||||
print("getsockname", s:getsockname())
|
||||
s:sendto("a", localhost, 12345)
|
||||
print("getsockname", s:getsockname())
|
||||
assert(tostring(s):find("udp{unconnected}"))
|
||||
print(s:receivefrom())
|
||||
s:close()
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
socket = require"socket"
|
||||
socket.unix = require"socket.unix"
|
||||
c = assert(socket.unix.dgram())
|
||||
print(c:bind("/tmp/bar"))
|
||||
while 1 do
|
||||
local l = io.read("*l")
|
||||
assert(c:sendto(l, "/tmp/foo"))
|
||||
print(assert(c:receivefrom()))
|
||||
end
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
socket = require"socket"
|
||||
socket.unix = require"socket.unix"
|
||||
u = assert(socket.unix.dgram())
|
||||
assert(u:bind("/tmp/foo"))
|
||||
while 1 do
|
||||
x, r = assert(u:receivefrom())
|
||||
print(x, r)
|
||||
assert(u:sendto(">" .. x, r))
|
||||
end
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
socket = require"socket"
|
||||
socket.unix = require"socket.unix"
|
||||
c = assert(socket.unix.stream())
|
||||
assert(c:connect("/tmp/foo"))
|
||||
while 1 do
|
||||
local l = io.read()
|
||||
assert(c:send(l .. "\n"))
|
||||
end
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
socket = require"socket"
|
||||
socket.unix = require"socket.unix"
|
||||
u = assert(socket.unix.stream())
|
||||
assert(u:bind("/tmp/foo"))
|
||||
assert(u:listen())
|
||||
c = assert(u:accept())
|
||||
while 1 do
|
||||
print(assert(c:receive()))
|
||||
end
|
||||
15
src/deps/src/luasocket/test/upload.html
vendored
15
src/deps/src/luasocket/test/upload.html
vendored
|
|
@ -1,15 +0,0 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>POST test</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<form action='http://localhost/luasocket-cgi-bin/cat-stdin' enctype='multipart/form-data' method=POST>
|
||||
<center>
|
||||
<input type="file" name="attach">
|
||||
<p>
|
||||
<input type=submit name=sendmail value="send">
|
||||
</center>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
738
src/deps/src/luasocket/test/urltest.lua
vendored
738
src/deps/src/luasocket/test/urltest.lua
vendored
|
|
@ -1,738 +0,0 @@
|
|||
local socket = require("socket")
|
||||
socket.url = require("socket.url")
|
||||
dofile("testsupport.lua")
|
||||
|
||||
local check_build_url = function(parsed)
|
||||
local built = socket.url.build(parsed)
|
||||
if built ~= parsed.url then
|
||||
print("built is different from expected")
|
||||
print(built)
|
||||
print(expected)
|
||||
os.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.")
|
||||
os.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")
|
||||
os.exit()
|
||||
end
|
||||
end
|
||||
|
||||
local check_parse_path = function(path, expect)
|
||||
local parsed = socket.url.parse_path(path)
|
||||
for i = 1, math.max(#parsed, #expect) do
|
||||
if parsed[i] ~= expect[i] then
|
||||
print(path)
|
||||
os.exit()
|
||||
end
|
||||
end
|
||||
if expect.is_directory ~= parsed.is_directory then
|
||||
print(path)
|
||||
print("is_directory mismatch")
|
||||
os.exit()
|
||||
end
|
||||
if expect.is_absolute ~= parsed.is_absolute then
|
||||
print(path)
|
||||
print("is_absolute mismatch")
|
||||
os.exit()
|
||||
end
|
||||
local built = socket.url.build_path(expect)
|
||||
if built ~= path then
|
||||
print(built, path)
|
||||
print("path composition failed.")
|
||||
os.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 base='", base, "', rel='", relative, "' expected '",
|
||||
absolute, "' but got '", res, "'\n")
|
||||
os.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
|
||||
os.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
|
||||
os.exit()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
print("testing URL parsing")
|
||||
check_parse_url{
|
||||
url = "scheme://user:pass$%?#wd@host:port/path;params?query#fragment",
|
||||
scheme = "scheme",
|
||||
authority = "user:pass$%?#wd@host:port",
|
||||
host = "host",
|
||||
port = "port",
|
||||
userinfo = "user:pass$%?#wd",
|
||||
password = "pass$%?#wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
check_parse_url{
|
||||
url = "scheme://user:pass?#wd@host:port/path;params?query#fragment",
|
||||
scheme = "scheme",
|
||||
authority = "user:pass?#wd@host:port",
|
||||
host = "host",
|
||||
port = "port",
|
||||
userinfo = "user:pass?#wd",
|
||||
password = "pass?#wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
check_parse_url{
|
||||
url = "scheme://user:pass-wd@host:port/path;params?query#fragment",
|
||||
scheme = "scheme",
|
||||
authority = "user:pass-wd@host:port",
|
||||
host = "host",
|
||||
port = "port",
|
||||
userinfo = "user:pass-wd",
|
||||
password = "pass-wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
check_parse_url{
|
||||
url = "scheme://user:pass#wd@host:port/path;params?query#fragment",
|
||||
scheme = "scheme",
|
||||
authority = "user:pass#wd@host:port",
|
||||
host = "host",
|
||||
port = "port",
|
||||
userinfo = "user:pass#wd",
|
||||
password = "pass#wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
check_parse_url{
|
||||
url = "scheme://user:pass#wd@host:port/path;params?query",
|
||||
scheme = "scheme",
|
||||
authority = "user:pass#wd@host:port",
|
||||
host = "host",
|
||||
port = "port",
|
||||
userinfo = "user:pass#wd",
|
||||
password = "pass#wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
}
|
||||
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"
|
||||
}
|
||||
|
||||
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",
|
||||
}
|
||||
|
||||
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 = ""
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
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"
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
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",
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
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",
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
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",
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "//host/path",
|
||||
authority = "host",
|
||||
host = "host",
|
||||
path = "/path",
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "//host",
|
||||
authority = "host",
|
||||
host = "host",
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "/path",
|
||||
path = "/path",
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "path",
|
||||
path = "path",
|
||||
}
|
||||
|
||||
-- IPv6 tests
|
||||
|
||||
check_parse_url{
|
||||
url = "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html",
|
||||
scheme = "http",
|
||||
host = "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210",
|
||||
authority = "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80",
|
||||
port = "80",
|
||||
path = "/index.html"
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "http://[1080:0:0:0:8:800:200C:417A]/index.html",
|
||||
scheme = "http",
|
||||
host = "1080:0:0:0:8:800:200C:417A",
|
||||
authority = "[1080:0:0:0:8:800:200C:417A]",
|
||||
path = "/index.html"
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "http://[3ffe:2a00:100:7031::1]",
|
||||
scheme = "http",
|
||||
host = "3ffe:2a00:100:7031::1",
|
||||
authority = "[3ffe:2a00:100:7031::1]",
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "http://[1080::8:800:200C:417A]/foo",
|
||||
scheme = "http",
|
||||
host = "1080::8:800:200C:417A",
|
||||
authority = "[1080::8:800:200C:417A]",
|
||||
path = "/foo"
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "http://[::192.9.5.5]/ipng",
|
||||
scheme = "http",
|
||||
host = "::192.9.5.5",
|
||||
authority = "[::192.9.5.5]",
|
||||
path = "/ipng"
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "http://[::FFFF:129.144.52.38]:80/index.html",
|
||||
scheme = "http",
|
||||
host = "::FFFF:129.144.52.38",
|
||||
port = "80",
|
||||
authority = "[::FFFF:129.144.52.38]:80",
|
||||
path = "/index.html"
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "http://[2010:836B:4179::836B:4179]",
|
||||
scheme = "http",
|
||||
host = "2010:836B:4179::836B:4179",
|
||||
authority = "[2010:836B:4179::836B:4179]",
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "//userinfo@[::FFFF:129.144.52.38]:port/path;params?query#fragment",
|
||||
authority = "userinfo@[::FFFF:129.144.52.38]:port",
|
||||
host = "::FFFF:129.144.52.38",
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
|
||||
check_parse_url{
|
||||
url = "scheme://user:password@[::192.9.5.5]:port/path;params?query#fragment",
|
||||
scheme = "scheme",
|
||||
authority = "user:password@[::192.9.5.5]:port",
|
||||
host = "::192.9.5.5",
|
||||
port = "port",
|
||||
userinfo = "user:password",
|
||||
user = "user",
|
||||
password = "password",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
check_build_url{
|
||||
url = "//userinfo@[::FFFF:129.144.52.38]:port/path;params?query#fragment",
|
||||
host = "::FFFF:129.144.52.38",
|
||||
port = "port",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
|
||||
check_build_url{
|
||||
url = "scheme://user:password@[::192.9.5.5]:port/path;params?query#fragment",
|
||||
scheme = "scheme",
|
||||
host = "::192.9.5.5",
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
check_build_url {
|
||||
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"
|
||||
}
|
||||
|
||||
check_build_url {
|
||||
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",
|
||||
}
|
||||
|
||||
check_build_url {
|
||||
url = "//host/path",
|
||||
host = "host",
|
||||
path = "/path",
|
||||
}
|
||||
|
||||
check_build_url {
|
||||
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",
|
||||
userinfo = "not used",
|
||||
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",
|
||||
userinfo = "not used",
|
||||
authority = "not used",
|
||||
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",
|
||||
userinfo = "user:password",
|
||||
authority = "not used",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
|
||||
check_build_url {
|
||||
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"
|
||||
}
|
||||
|
||||
-- standard RFC tests
|
||||
print("testing absolute resolution")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g:h", "g:h")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g", "http://a/b/c/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "./g", "http://a/b/c/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g/", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "/g", "http://a/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "//g", "http://g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "?y", "http://a/b/c/d;p?y")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g?y", "http://a/b/c/g?y")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g?y/./x", "http://a/b/c/g?y/x")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "#s", "http://a/b/c/d;p?q#s")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g#s", "http://a/b/c/g#s")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g#s/./x", "http://a/b/c/g#s/x")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g?y#s", "http://a/b/c/g?y#s")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", ";x", "http://a/b/c/d;x")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g;x", "http://a/b/c/g;x")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g;x?y#s", "http://a/b/c/g;x?y#s")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", ".", "http://a/b/c/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "./", "http://a/b/c/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "./g", "http://a/b/c/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "./g/", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "././g", "http://a/b/c/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "././g/", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g/.", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g/./", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g/./.", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g/././", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "./.", "http://a/b/c/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "././.", "http://a/b/c/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "././g/./.", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "..", "http://a/b/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "../", "http://a/b/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "../g", "http://a/b/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "../..", "http://a/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "../../", "http://a/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "../../g", "http://a/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "../../../g", "http://a/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "", "http://a/b/c/d;p?q#f")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "/./g", "http://a/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "/../g", "http://a/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g.", "http://a/b/c/g.")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", ".g", "http://a/b/c/.g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g..", "http://a/b/c/g..")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "..g", "http://a/b/c/..g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "./../g", "http://a/b/g")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "./g/.", "http://a/b/c/g/")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g/./h", "http://a/b/c/g/h")
|
||||
check_absolute_url("http://a/b/c/d;p?q#f", "g/../h", "http://a/b/c/h")
|
||||
|
||||
check_absolute_url("http://a/b/c/d:p?q#f/", "../g/", "http://a/b/g/")
|
||||
check_absolute_url("http://a/b/c/d:p?q#f/", "../g", "http://a/b/g")
|
||||
check_absolute_url("http://a/b/c/d:p?q#f/", "../.g/", "http://a/b/.g/")
|
||||
check_absolute_url("http://a/b/c/d:p?q#f/", "../.g", "http://a/b/.g")
|
||||
check_absolute_url("http://a/b/c/d:p?q#f/", "../.g.h/", "http://a/b/.g.h/")
|
||||
check_absolute_url("http://a/b/c/d:p?q#f/", "../.g.h", "http://a/b/.g.h")
|
||||
|
||||
check_absolute_url("http://a/b/c/d:p?q#f/", "g.h/", "http://a/b/c/g.h/")
|
||||
check_absolute_url("http://a/b/c/d:p?q#f/", "../g.h/", "http://a/b/g.h/")
|
||||
check_absolute_url("http://a/", "../g.h/", "http://a/g.h/")
|
||||
|
||||
-- extra tests
|
||||
check_absolute_url("//a/b/c/d;p?q#f", "d/e/f", "//a/b/c/d/e/f")
|
||||
check_absolute_url("/a/b/c/d;p?q#f", "d/e/f", "/a/b/c/d/e/f")
|
||||
check_absolute_url("a/b/c/d", "d/e/f", "a/b/c/d/e/f")
|
||||
check_absolute_url("a/b/c/d/../", "d/e/f", "a/b/c/d/e/f")
|
||||
check_absolute_url("http://velox.telemar.com.br", "/dashboard/index.html",
|
||||
"http://velox.telemar.com.br/dashboard/index.html")
|
||||
check_absolute_url("http://example.com/", "../.badhost.com/", "http://example.com/.badhost.com/")
|
||||
check_absolute_url("http://example.com/", "...badhost.com/", "http://example.com/...badhost.com/")
|
||||
check_absolute_url("http://example.com/a/b/c/d/", "../q", "http://example.com/a/b/c/q")
|
||||
check_absolute_url("http://example.com/a/b/c/d/", "../../q", "http://example.com/a/b/q")
|
||||
check_absolute_url("http://example.com/a/b/c/d/", "../../../q", "http://example.com/a/q")
|
||||
check_absolute_url("http://example.com", ".badhost.com", "http://example.com/.badhost.com")
|
||||
check_absolute_url("http://example.com/a/b/c/d/", "..//../../../q", "http://example.com/a/q")
|
||||
check_absolute_url("http://example.com/a/b/c/d/", "..//a/../../../../q", "http://example.com/a/q")
|
||||
check_absolute_url("http://example.com/a/b/c/d/", "..//a/..//../../../q", "http://example.com/a/b/q")
|
||||
check_absolute_url("http://example.com/a/b/c/d/", "..//a/..///../../../../q", "http://example.com/a/b/q")
|
||||
check_absolute_url("http://example.com/a/b/c/d/", "../x/a/../y/z/../../../../q", "http://example.com/a/b/q")
|
||||
|
||||
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})
|
||||
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})
|
||||
check_parse_path("eu/tu", { "eu", "tu" })
|
||||
|
||||
print("testing path protection")
|
||||
check_protect({ "eu", "-_.!~*'():@&=+$,", "tu" }, "eu/-_.!~*'():@&=+$,/tu")
|
||||
check_protect({ "eu ", "~diego" }, "eu%20/~diego")
|
||||
check_protect({ "/eu>", "<diego?" }, "%2Feu%3E/%3Cdiego%3F")
|
||||
check_protect({ "\\eu]", "[diego`" }, "%5Ceu%5D/%5Bdiego%60")
|
||||
check_protect({ "{eu}", "|diego\127" }, "%7Beu%7D/%7Cdiego%7F")
|
||||
check_protect({ "eu ", "~diego" }, "eu /~diego", 1)
|
||||
check_protect({ "/eu>", "<diego?" }, "/eu>/<diego?", 1)
|
||||
check_protect({ "\\eu]", "[diego`" }, "\\eu]/[diego`", 1)
|
||||
check_protect({ "{eu}", "|diego\127" }, "{eu}/|diego\127", 1)
|
||||
|
||||
print("testing inversion")
|
||||
check_invert("http:")
|
||||
check_invert("a/b/c/d.html")
|
||||
check_invert("//net_loc")
|
||||
check_invert("http:a/b/d/c.html")
|
||||
check_invert("//net_loc/a/b/d/c.html")
|
||||
check_invert("http://net_loc/a/b/d/c.html")
|
||||
check_invert("//who:isit@net_loc")
|
||||
check_invert("http://he:man@boo.bar/a/b/c/i.html;type=moo?this=that#mark")
|
||||
check_invert("/b/c/d#fragment")
|
||||
check_invert("/b/c/d;param#fragment")
|
||||
check_invert("/b/c/d;param?query#fragment")
|
||||
check_invert("/b/c/d?query")
|
||||
check_invert("/b/c/d;param?query")
|
||||
check_invert("http://he:man@[::192.168.1.1]/a/b/c/i.html;type=moo?this=that#mark")
|
||||
|
||||
print("the library passed all tests")
|
||||
644
src/deps/src/luasocket/test/utestclnt.lua
vendored
644
src/deps/src/luasocket/test/utestclnt.lua
vendored
|
|
@ -1,644 +0,0 @@
|
|||
local socket = require"socket"
|
||||
socket.unix = require"socket.unix"
|
||||
|
||||
host = host or "luasocket"
|
||||
|
||||
function pass(...)
|
||||
local s = string.format(...)
|
||||
io.stderr:write(s, "\n")
|
||||
end
|
||||
|
||||
function fail(...)
|
||||
local s = string.format(...)
|
||||
io.stderr:write("ERROR: ", s, "!\n")
|
||||
socket.sleep(3)
|
||||
os.exit()
|
||||
end
|
||||
|
||||
function warn(...)
|
||||
local s = string.format(...)
|
||||
io.stderr:write("WARNING: ", s, "\n")
|
||||
end
|
||||
|
||||
function remote(...)
|
||||
local s = string.format(...)
|
||||
s = string.gsub(s, "\n", ";")
|
||||
s = string.gsub(s, "%s+", " ")
|
||||
s = string.gsub(s, "^%s*", "")
|
||||
control:send(s .. "\n")
|
||||
control:receive()
|
||||
end
|
||||
|
||||
function test(test)
|
||||
io.stderr:write("----------------------------------------------\n",
|
||||
"testing: ", test, "\n",
|
||||
"----------------------------------------------\n")
|
||||
end
|
||||
|
||||
function uconnect(path)
|
||||
local u = assert(socket.unix())
|
||||
assert(u:connect(path))
|
||||
return u
|
||||
end
|
||||
|
||||
function ubind(path)
|
||||
local u = assert(socket.unix())
|
||||
assert(u:bind(path))
|
||||
assert(u:listen(5))
|
||||
return u
|
||||
end
|
||||
|
||||
function check_timeout(tm, sl, elapsed, err, opp, mode, alldone)
|
||||
if tm < sl then
|
||||
if opp == "send" then
|
||||
if not err then warn("must be buffered")
|
||||
elseif err == "timeout" then pass("proper timeout")
|
||||
else fail("unexpected error '%s'", err) end
|
||||
else
|
||||
if err ~= "timeout" then fail("should have timed out")
|
||||
else pass("proper timeout") end
|
||||
end
|
||||
else
|
||||
if mode == "total" then
|
||||
if elapsed > tm then
|
||||
if err ~= "timeout" then fail("should have timed out")
|
||||
else pass("proper timeout") end
|
||||
elseif elapsed < tm then
|
||||
if err then fail(err)
|
||||
else pass("ok") end
|
||||
else
|
||||
if alldone then
|
||||
if err then fail("unexpected error '%s'", err)
|
||||
else pass("ok") end
|
||||
else
|
||||
if err ~= "timeout" then fail(err)
|
||||
else pass("proper timeoutk") end
|
||||
end
|
||||
end
|
||||
else
|
||||
if err then fail(err)
|
||||
else pass("ok") end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not socket._DEBUG then
|
||||
fail("Please define LUASOCKET_DEBUG and recompile LuaSocket")
|
||||
end
|
||||
|
||||
io.stderr:write("----------------------------------------------\n",
|
||||
"LuaSocket Test Procedures\n",
|
||||
"----------------------------------------------\n")
|
||||
|
||||
start = socket.gettime()
|
||||
|
||||
function reconnect()
|
||||
io.stderr:write("attempting data connection... ")
|
||||
if data then data:close() end
|
||||
remote [[
|
||||
i = i or 1
|
||||
if data then data:close() data = nil end
|
||||
print("accepting")
|
||||
data = server:accept()
|
||||
i = i + 1
|
||||
print("done " .. i)
|
||||
]]
|
||||
data, err = uconnect(host, port)
|
||||
if not data then fail(err)
|
||||
else pass("connected!") end
|
||||
end
|
||||
|
||||
pass("attempting control connection...")
|
||||
control, err = uconnect(host, port)
|
||||
if err then fail(err)
|
||||
else pass("connected!") end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_methods(sock, methods)
|
||||
for _, v in pairs(methods) do
|
||||
if type(sock[v]) ~= "function" then
|
||||
fail(sock.class .. " method '" .. v .. "' not registered")
|
||||
end
|
||||
end
|
||||
pass(sock.class .. " methods are ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_mixed(len)
|
||||
reconnect()
|
||||
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"
|
||||
local p3 = "raw " .. string.rep("z", inter) .. "bytes"
|
||||
local p4 = "end" .. string.rep("w", inter) .. "bytes"
|
||||
local bp1, bp2, bp3, bp4
|
||||
remote (string.format("str = data:receive(%d)",
|
||||
string.len(p1)+string.len(p2)+string.len(p3)+string.len(p4)))
|
||||
sent, err = data:send(p1..p2..p3..p4)
|
||||
if err then fail(err) end
|
||||
remote "data:send(str); data:close()"
|
||||
bp1, err = data:receive()
|
||||
if err then fail(err) end
|
||||
bp2, err = data:receive()
|
||||
if err then fail(err) end
|
||||
bp3, err = data:receive(string.len(p3))
|
||||
if err then fail(err) end
|
||||
bp4, err = data:receive("*a")
|
||||
if err then fail(err) end
|
||||
if bp1.."\n" == p1 and bp2.."\r\n" == p2 and bp3 == p3 and bp4 == p4 then
|
||||
pass("patterns match")
|
||||
else fail("patterns don't match") end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_asciiline(len)
|
||||
reconnect()
|
||||
local str, str10, back, err
|
||||
str = string.rep("x", math.mod(len, 10))
|
||||
str10 = string.rep("aZb.c#dAe?", math.floor(len/10))
|
||||
str = str .. str10
|
||||
remote "str = data:receive()"
|
||||
sent, err = data:send(str.."\n")
|
||||
if err then fail(err) end
|
||||
remote "data:send(str ..'\\n')"
|
||||
back, err = data:receive()
|
||||
if err then fail(err) end
|
||||
if back == str then pass("lines match")
|
||||
else fail("lines don't match") end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_rawline(len)
|
||||
reconnect()
|
||||
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),
|
||||
math.floor(len/10))
|
||||
str = str .. str10
|
||||
remote "str = data:receive()"
|
||||
sent, err = data:send(str.."\n")
|
||||
if err then fail(err) end
|
||||
remote "data:send(str..'\\n')"
|
||||
back, err = data:receive()
|
||||
if err then fail(err) end
|
||||
if back == str then pass("lines match")
|
||||
else fail("lines don't match") end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_raw(len)
|
||||
reconnect()
|
||||
local half = math.floor(len/2)
|
||||
local s1, s2, back, err
|
||||
s1 = string.rep("x", half)
|
||||
s2 = string.rep("y", len-half)
|
||||
remote (string.format("str = data:receive(%d)", len))
|
||||
sent, err = data:send(s1)
|
||||
if err then fail(err) end
|
||||
sent, err = data:send(s2)
|
||||
if err then fail(err) end
|
||||
remote "data:send(str)"
|
||||
back, err = data:receive(len)
|
||||
if err then fail(err) end
|
||||
if back == s1..s2 then pass("blocks match")
|
||||
else fail("blocks don't match") end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_totaltimeoutreceive(len, tm, sl)
|
||||
reconnect()
|
||||
local str, err, partial
|
||||
pass("%d bytes, %ds total timeout, %ds pause", len, tm, sl)
|
||||
remote (string.format ([[
|
||||
data:settimeout(%d)
|
||||
str = string.rep('a', %d)
|
||||
data:send(str)
|
||||
print('server: sleeping for %ds')
|
||||
socket.sleep(%d)
|
||||
print('server: woke up')
|
||||
data:send(str)
|
||||
]], 2*tm, len, sl, sl))
|
||||
data:settimeout(tm, "total")
|
||||
local t = socket.gettime()
|
||||
str, err, partial, elapsed = data:receive(2*len)
|
||||
check_timeout(tm, sl, elapsed, err, "receive", "total",
|
||||
string.len(str or partial) == 2*len)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_totaltimeoutsend(len, tm, sl)
|
||||
reconnect()
|
||||
local str, err, total
|
||||
pass("%d bytes, %ds total timeout, %ds pause", len, tm, sl)
|
||||
remote (string.format ([[
|
||||
data:settimeout(%d)
|
||||
str = data:receive(%d)
|
||||
print('server: sleeping for %ds')
|
||||
socket.sleep(%d)
|
||||
print('server: woke up')
|
||||
str = data:receive(%d)
|
||||
]], 2*tm, len, sl, sl, len))
|
||||
data:settimeout(tm, "total")
|
||||
str = string.rep("a", 2*len)
|
||||
total, err, partial, elapsed = data:send(str)
|
||||
check_timeout(tm, sl, elapsed, err, "send", "total",
|
||||
total == 2*len)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_blockingtimeoutreceive(len, tm, sl)
|
||||
reconnect()
|
||||
local str, err, partial
|
||||
pass("%d bytes, %ds blocking timeout, %ds pause", len, tm, sl)
|
||||
remote (string.format ([[
|
||||
data:settimeout(%d)
|
||||
str = string.rep('a', %d)
|
||||
data:send(str)
|
||||
print('server: sleeping for %ds')
|
||||
socket.sleep(%d)
|
||||
print('server: woke up')
|
||||
data:send(str)
|
||||
]], 2*tm, len, sl, sl))
|
||||
data:settimeout(tm)
|
||||
str, err, partial, elapsed = data:receive(2*len)
|
||||
check_timeout(tm, sl, elapsed, err, "receive", "blocking",
|
||||
string.len(str or partial) == 2*len)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_blockingtimeoutsend(len, tm, sl)
|
||||
reconnect()
|
||||
local str, err, total
|
||||
pass("%d bytes, %ds blocking timeout, %ds pause", len, tm, sl)
|
||||
remote (string.format ([[
|
||||
data:settimeout(%d)
|
||||
str = data:receive(%d)
|
||||
print('server: sleeping for %ds')
|
||||
socket.sleep(%d)
|
||||
print('server: woke up')
|
||||
str = data:receive(%d)
|
||||
]], 2*tm, len, sl, sl, len))
|
||||
data:settimeout(tm)
|
||||
str = string.rep("a", 2*len)
|
||||
total, err, partial, elapsed = data:send(str)
|
||||
check_timeout(tm, sl, elapsed, err, "send", "blocking",
|
||||
total == 2*len)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function empty_connect()
|
||||
reconnect()
|
||||
if data then data:close() data = nil end
|
||||
remote [[
|
||||
if data then data:close() data = nil end
|
||||
data = server:accept()
|
||||
]]
|
||||
data, err = socket.connect("", port)
|
||||
if not data then
|
||||
pass("ok")
|
||||
data = socket.connect(host, port)
|
||||
else
|
||||
pass("gethostbyname returns localhost on empty string...")
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function isclosed(c)
|
||||
return c:getfd() == -1 or c:getfd() == (2^32-1)
|
||||
end
|
||||
|
||||
function active_close()
|
||||
reconnect()
|
||||
if isclosed(data) then fail("should not be closed") end
|
||||
data:close()
|
||||
if not isclosed(data) then fail("should be closed") end
|
||||
data = nil
|
||||
local udp = socket.udp()
|
||||
if isclosed(udp) then fail("should not be closed") end
|
||||
udp:close()
|
||||
if not isclosed(udp) then fail("should be closed") end
|
||||
pass("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_closed()
|
||||
local back, partial, err
|
||||
local str = 'little string'
|
||||
reconnect()
|
||||
pass("trying read detection")
|
||||
remote (string.format ([[
|
||||
data:send('%s')
|
||||
data:close()
|
||||
data = nil
|
||||
]], str))
|
||||
-- try to get a line
|
||||
back, err, partial = data:receive()
|
||||
if not err then fail("should have gotten 'closed'.")
|
||||
elseif err ~= "closed" then fail("got '"..err.."' instead of 'closed'.")
|
||||
elseif str ~= partial then fail("didn't receive partial result.")
|
||||
else pass("graceful 'closed' received") end
|
||||
reconnect()
|
||||
pass("trying write detection")
|
||||
remote [[
|
||||
data:close()
|
||||
data = nil
|
||||
]]
|
||||
total, err, partial = data:send(string.rep("ugauga", 100000))
|
||||
if not err then
|
||||
pass("failed: output buffer is at least %d bytes long!", total)
|
||||
elseif err ~= "closed" then
|
||||
fail("got '"..err.."' instead of 'closed'.")
|
||||
else
|
||||
pass("graceful 'closed' received after %d bytes were sent", partial)
|
||||
end
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_selectbugs()
|
||||
local r, s, e = socket.select(nil, nil, 0.1)
|
||||
assert(type(r) == "table" and type(s) == "table" and
|
||||
(e == "timeout" or e == "error"))
|
||||
pass("both nil: ok")
|
||||
local udp = socket.udp()
|
||||
udp:close()
|
||||
r, s, e = socket.select({ udp }, { udp }, 0.1)
|
||||
assert(type(r) == "table" and type(s) == "table" and
|
||||
(e == "timeout" or e == "error"))
|
||||
pass("closed sockets: ok")
|
||||
e = pcall(socket.select, "wrong", 1, 0.1)
|
||||
assert(e == false)
|
||||
e = pcall(socket.select, {}, 1, 0.1)
|
||||
assert(e == false)
|
||||
pass("invalid input: ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function accept_timeout()
|
||||
io.stderr:write("accept with timeout (if it hangs, it failed): ")
|
||||
local s, e = socket.bind("*", 0, 0)
|
||||
assert(s, e)
|
||||
local t = socket.gettime()
|
||||
s:settimeout(1)
|
||||
local c, e = s:accept()
|
||||
assert(not c, "should not accept")
|
||||
assert(e == "timeout", string.format("wrong error message (%s)", e))
|
||||
t = socket.gettime() - t
|
||||
assert(t < 2, string.format("took to long to give up (%gs)", t))
|
||||
s:close()
|
||||
pass("good")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function connect_timeout()
|
||||
io.stderr:write("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("127.0.0.2", 80)
|
||||
assert(not r, "should not connect")
|
||||
assert(socket.gettime() - t < 2, "took too long to give up.")
|
||||
c:close()
|
||||
print("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function accept_errors()
|
||||
io.stderr:write("not listening: ")
|
||||
local d, e = socket.bind("*", 0)
|
||||
assert(d, e);
|
||||
local c, e = socket.tcp();
|
||||
assert(c, e);
|
||||
d:setfd(c:getfd())
|
||||
d:settimeout(2)
|
||||
local r, e = d:accept()
|
||||
assert(not r and e)
|
||||
print("ok: ", e)
|
||||
io.stderr:write("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)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function connect_errors()
|
||||
io.stderr:write("connection refused: ")
|
||||
local c, e = socket.connect("localhost", 1);
|
||||
assert(not c and e)
|
||||
print("ok: ", e)
|
||||
io.stderr:write("host not found: ")
|
||||
local c, e = socket.connect("host.is.invalid", 1);
|
||||
assert(not c and e, e)
|
||||
print("ok: ", e)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function rebind_test()
|
||||
local c = socket.bind("localhost", 0)
|
||||
local i, p = c:getsockname()
|
||||
local s, e = socket.tcp()
|
||||
assert(s, e)
|
||||
s:setoption("reuseaddr", false)
|
||||
r, e = s:bind("localhost", p)
|
||||
assert(not r, "managed to rebind!")
|
||||
assert(e)
|
||||
print("ok: ", e)
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function getstats_test()
|
||||
reconnect()
|
||||
local t = 0
|
||||
for i = 1, 25 do
|
||||
local c = math.random(1, 100)
|
||||
remote (string.format ([[
|
||||
str = data:receive(%d)
|
||||
data:send(str)
|
||||
]], c))
|
||||
data:send(string.rep("a", c))
|
||||
data:receive(c)
|
||||
t = t + c
|
||||
local r, s, a = data:getstats()
|
||||
assert(r == t, "received count failed" .. tostring(r)
|
||||
.. "/" .. tostring(t))
|
||||
assert(s == t, "sent count failed" .. tostring(s)
|
||||
.. "/" .. tostring(t))
|
||||
end
|
||||
print("ok")
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------------
|
||||
function test_nonblocking(size)
|
||||
reconnect()
|
||||
print("Testing " .. 2*size .. " bytes")
|
||||
remote(string.format([[
|
||||
data:send(string.rep("a", %d))
|
||||
socket.sleep(0.5)
|
||||
data:send(string.rep("b", %d) .. "\n")
|
||||
]], size, size))
|
||||
local err = "timeout"
|
||||
local part = ""
|
||||
local str
|
||||
data:settimeout(0)
|
||||
while 1 do
|
||||
str, err, part = data:receive("*l", part)
|
||||
if err ~= "timeout" then break end
|
||||
end
|
||||
assert(str == (string.rep("a", size) .. string.rep("b", size)))
|
||||
reconnect()
|
||||
remote(string.format([[
|
||||
str = data:receive(%d)
|
||||
socket.sleep(0.5)
|
||||
str = data:receive(%d, str)
|
||||
data:send(str)
|
||||
]], size, size))
|
||||
data:settimeout(0)
|
||||
local start = 0
|
||||
while 1 do
|
||||
ret, err, start = data:send(str, start+1)
|
||||
if err ~= "timeout" then break end
|
||||
end
|
||||
data:send("\n")
|
||||
data:settimeout(-1)
|
||||
local back = data:receive(2*size)
|
||||
assert(back == str, "'" .. back .. "' vs '" .. str .. "'")
|
||||
print("ok")
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
test("method registration")
|
||||
test_methods(socket.unix(), {
|
||||
"accept",
|
||||
"bind",
|
||||
"close",
|
||||
"connect",
|
||||
"dirty",
|
||||
"getfd",
|
||||
"getstats",
|
||||
"setstats",
|
||||
"listen",
|
||||
"receive",
|
||||
"send",
|
||||
"setfd",
|
||||
"setoption",
|
||||
"setpeername",
|
||||
"setsockname",
|
||||
"settimeout",
|
||||
"shutdown",
|
||||
})
|
||||
|
||||
test("connect function")
|
||||
--connect_timeout()
|
||||
--empty_connect()
|
||||
--connect_errors()
|
||||
|
||||
--test("rebinding: ")
|
||||
--rebind_test()
|
||||
|
||||
test("active close: ")
|
||||
active_close()
|
||||
|
||||
test("closed connection detection: ")
|
||||
test_closed()
|
||||
|
||||
test("accept function: ")
|
||||
accept_timeout()
|
||||
accept_errors()
|
||||
|
||||
test("getstats test")
|
||||
getstats_test()
|
||||
|
||||
test("character line")
|
||||
test_asciiline(1)
|
||||
test_asciiline(17)
|
||||
test_asciiline(200)
|
||||
test_asciiline(4091)
|
||||
test_asciiline(80199)
|
||||
test_asciiline(8000000)
|
||||
test_asciiline(80199)
|
||||
test_asciiline(4091)
|
||||
test_asciiline(200)
|
||||
test_asciiline(17)
|
||||
test_asciiline(1)
|
||||
|
||||
test("mixed patterns")
|
||||
test_mixed(1)
|
||||
test_mixed(17)
|
||||
test_mixed(200)
|
||||
test_mixed(4091)
|
||||
test_mixed(801990)
|
||||
test_mixed(4091)
|
||||
test_mixed(200)
|
||||
test_mixed(17)
|
||||
test_mixed(1)
|
||||
|
||||
test("binary line")
|
||||
test_rawline(1)
|
||||
test_rawline(17)
|
||||
test_rawline(200)
|
||||
test_rawline(4091)
|
||||
test_rawline(80199)
|
||||
test_rawline(8000000)
|
||||
test_rawline(80199)
|
||||
test_rawline(4091)
|
||||
test_rawline(200)
|
||||
test_rawline(17)
|
||||
test_rawline(1)
|
||||
|
||||
test("raw transfer")
|
||||
test_raw(1)
|
||||
test_raw(17)
|
||||
test_raw(200)
|
||||
test_raw(4091)
|
||||
test_raw(80199)
|
||||
test_raw(8000000)
|
||||
test_raw(80199)
|
||||
test_raw(4091)
|
||||
test_raw(200)
|
||||
test_raw(17)
|
||||
test_raw(1)
|
||||
|
||||
test("non-blocking transfer")
|
||||
test_nonblocking(1)
|
||||
test_nonblocking(17)
|
||||
test_nonblocking(200)
|
||||
test_nonblocking(4091)
|
||||
test_nonblocking(80199)
|
||||
test_nonblocking(8000000)
|
||||
test_nonblocking(80199)
|
||||
test_nonblocking(4091)
|
||||
test_nonblocking(200)
|
||||
test_nonblocking(17)
|
||||
test_nonblocking(1)
|
||||
|
||||
test("total timeout on send")
|
||||
test_totaltimeoutsend(800091, 1, 3)
|
||||
test_totaltimeoutsend(800091, 2, 3)
|
||||
test_totaltimeoutsend(800091, 5, 2)
|
||||
test_totaltimeoutsend(800091, 3, 1)
|
||||
|
||||
test("total timeout on receive")
|
||||
test_totaltimeoutreceive(800091, 1, 3)
|
||||
test_totaltimeoutreceive(800091, 2, 3)
|
||||
test_totaltimeoutreceive(800091, 3, 2)
|
||||
test_totaltimeoutreceive(800091, 3, 1)
|
||||
|
||||
test("blocking timeout on send")
|
||||
test_blockingtimeoutsend(800091, 1, 3)
|
||||
test_blockingtimeoutsend(800091, 2, 3)
|
||||
test_blockingtimeoutsend(800091, 3, 2)
|
||||
test_blockingtimeoutsend(800091, 3, 1)
|
||||
|
||||
test("blocking timeout on receive")
|
||||
test_blockingtimeoutreceive(800091, 1, 3)
|
||||
test_blockingtimeoutreceive(800091, 2, 3)
|
||||
test_blockingtimeoutreceive(800091, 3, 2)
|
||||
test_blockingtimeoutreceive(800091, 3, 1)
|
||||
|
||||
test(string.format("done in %.2fs", socket.gettime() - start))
|
||||
17
src/deps/src/luasocket/test/utestsrvr.lua
vendored
17
src/deps/src/luasocket/test/utestsrvr.lua
vendored
|
|
@ -1,17 +0,0 @@
|
|||
socket=require("socket");
|
||||
os.remove("/tmp/luasocket")
|
||||
socket.unix = require("socket.unix");
|
||||
host = host or "luasocket";
|
||||
server = assert(socket.unix())
|
||||
assert(server:bind(host))
|
||||
assert(server:listen(5))
|
||||
ack = "\n";
|
||||
while 1 do
|
||||
print("server: waiting for client connection...");
|
||||
control = assert(server:accept());
|
||||
while 1 do
|
||||
command = assert(control:receive());
|
||||
assert(control:send(ack));
|
||||
((loadstring or load)(command))();
|
||||
end
|
||||
end
|
||||
Loading…
Reference in a new issue