mirror of
https://github.com/lunarmodules/luasocket.git
synced 2025-07-13 06:04:31 +02:00
Compare commits
4 Commits
master
...
f815d7005c
Author | SHA1 | Date | |
---|---|---|---|
f815d7005c | |||
b281e6f717 | |||
784b0631e1 | |||
a1b5d3abd1 |
8
.github/workflows/build.yml
vendored
8
.github/workflows/build.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
luaVersion: [ "5.4", "5.3", "5.2", "5.1", "luajit", "luajit-openresty" ]
|
||||
platform: [ "ubuntu-22.04", "macos-14", "windows-2022" ]
|
||||
platform: [ "ubuntu-22.04", "macos-11", "windows-2022" ]
|
||||
runs-on: ${{ matrix.platform }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
@ -22,13 +22,11 @@ jobs:
|
||||
if: ${{ startsWith(matrix.platform, 'windows') && !startsWith(matrix.luaVersion, 'luajit') }}
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: Setup ‘lua’
|
||||
uses: luarocks/gh-actions-lua@v10
|
||||
uses: leso-kn/gh-actions-lua@v11-staging
|
||||
with:
|
||||
luaVersion: ${{ matrix.luaVersion }}
|
||||
buildCache: false
|
||||
- name: Setup ‘luarocks’
|
||||
# master branch until tagged release has luajit & msvcrt fixes
|
||||
uses: luarocks/gh-actions-luarocks@master
|
||||
uses: hishamhm/gh-actions-luarocks@master
|
||||
- name: Make and install
|
||||
run: |
|
||||
luarocks make -- luasocket-scm-3.rockspec
|
||||
|
@ -55,7 +55,7 @@ protocol. For that, check the implementation.
|
||||
|
||||
<p>
|
||||
To really benefit from this module, a good understanding of
|
||||
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">
|
||||
LTN012, Filters sources and sinks</a> is necessary.
|
||||
</p>
|
||||
|
||||
@ -122,7 +122,7 @@ 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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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:
|
||||
@ -136,7 +136,7 @@ authentication. Defaults to "<tt>ftp:anonymous@anonymous.org</tt>";</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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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
|
||||
@ -206,7 +206,7 @@ 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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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
|
||||
@ -221,7 +221,7 @@ authentication. Defaults to "<tt>ftp:anonymous@anonymous.org</tt>";</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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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
|
||||
|
@ -52,7 +52,7 @@ implementation conforms to the HTTP/1.1 standard,
|
||||
The module exports functions that provide HTTP functionality in different
|
||||
levels of abstraction. From the simple
|
||||
string oriented requests, through generic
|
||||
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a> based, down to even lower-level if you bother to look through the source code.
|
||||
<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>
|
||||
@ -144,7 +144,7 @@ http.<b>request{</b><br>
|
||||
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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a> based.
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a> based.
|
||||
</p>
|
||||
|
||||
<p class="parameters">
|
||||
@ -158,7 +158,7 @@ in the <tt>url</tt>. Otherwise, it performs a <tt>GET</tt> in the
|
||||
<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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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.
|
||||
@ -172,13 +172,13 @@ following:
|
||||
<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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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>
|
||||
|
@ -37,30 +37,70 @@ Installation">
|
||||
|
||||
<!-- installation ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<h2>Installation via luarocks</h2>
|
||||
<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>LuaSocket can be easily installed using <a href="https://luarocks.org/" target="_blank">LuaRocks</a>, the Lua package manager.</p>
|
||||
<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>
|
||||
|
||||
<h3>Installing via LuaRocks</h3>
|
||||
|
||||
<p>Run the following command in your terminal:</p>
|
||||
<pre class=example>
|
||||
luarocks install luasocket
|
||||
<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>
|
||||
|
||||
<h3>Verification</h3>
|
||||
<p>To verify that LuaSocket is installed correctly, open Lua and run:</p>
|
||||
<pre class=example><code>
|
||||
local socket = require("socket")
|
||||
print(socket._VERSION)
|
||||
</code></pre>
|
||||
<p> Naturally, on Unix systems, <tt>core.dll</tt>
|
||||
would be replaced by <tt>core.so</tt>.
|
||||
</p>
|
||||
|
||||
<p>If you see output like <strong>LuaSocket 3.0</strong>, the installation was successful.</p>
|
||||
<h3>Using LuaSocket</h3>
|
||||
|
||||
<h3>More Information</h3>
|
||||
<p>For more details, visit the <a href="https://github.com/lunarmodules/luasocket" target="_blank">LuaSocket GitHub repository</a>.</p>
|
||||
<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.1.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 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
|
@ -54,7 +54,7 @@ MIME is described mainly in
|
||||
<p>
|
||||
All functionality provided by the MIME module
|
||||
follows the ideas presented in
|
||||
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">
|
||||
LTN012, Filters sources and sinks</a>.
|
||||
</p>
|
||||
|
||||
|
@ -57,7 +57,7 @@ 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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md"> LTN012, Filters
|
||||
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>
|
||||
@ -122,7 +122,7 @@ smtp.<b>message(</b>mesgt<b>)</b>
|
||||
|
||||
<p class="description">
|
||||
Returns a <em>simple</em>
|
||||
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a> source that sends an SMTP message body, possibly multipart (arbitrarily deep).
|
||||
<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">
|
||||
@ -155,7 +155,7 @@ multipart-mesgt = {<br>
|
||||
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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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>.
|
||||
@ -163,7 +163,7 @@ recursively defines each part as an independent message, plus an optional
|
||||
|
||||
<p class="return">
|
||||
The function returns a <em>simple</em>
|
||||
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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
|
||||
@ -264,7 +264,7 @@ The sender is given by the e-mail address in the <tt>from</tt> field.
|
||||
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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
<tt>source</tt>. Several arguments are optional:
|
||||
</p>
|
||||
<ul>
|
||||
@ -276,7 +276,7 @@ methods if supported by the server (both are unsafe);</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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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
|
||||
@ -308,7 +308,7 @@ 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="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<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>
|
||||
|
@ -311,7 +311,7 @@ socket.<b>sink(</b>mode, socket<b>)</b>
|
||||
|
||||
<p class="description">
|
||||
Creates an
|
||||
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
sink from a stream socket object.
|
||||
</p>
|
||||
|
||||
@ -386,7 +386,7 @@ socket.<b>source(</b>mode, socket [, length]<b>)</b>
|
||||
|
||||
<p class="description">
|
||||
Creates an
|
||||
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">LTN12</a>
|
||||
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
|
||||
source from a stream socket object.
|
||||
</p>
|
||||
|
||||
|
@ -149,8 +149,8 @@ wild-card address).
|
||||
<!-- gettimeout +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||
|
||||
<p class="name" id="gettimeout">
|
||||
connected:<b>gettimeout()</b><br>
|
||||
unconnected:<b>gettimeout()</b>
|
||||
connected:<b>settimeout(</b>value<b>)</b><br>
|
||||
unconnected:<b>settimeout(</b>value<b>)</b>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
|
@ -60,7 +60,7 @@ An URL is defined by the following grammar:
|
||||
|
||||
<blockquote>
|
||||
<tt>
|
||||
<url> ::= [<scheme>:][//<authority>][/<path>][;<params>][?<query>][#<fragment>]<br>
|
||||
<url> ::= [<scheme>:][//<authority>][/<path>][?<query>][#<fragment>]<br>
|
||||
<authority> ::= [<userinfo>@]<host>[:<port>]<br>
|
||||
<userinfo> ::= <user>[:<password>]<br>
|
||||
<path> ::= {<segment>/}<segment><br>
|
||||
@ -225,7 +225,6 @@ parsed_url = {<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>
|
||||
@ -255,7 +254,6 @@ parsed_url = url.parse("ftp://root:passwd@unsafe.org/pub/virus.exe;type=i")
|
||||
-- scheme = "ftp",
|
||||
-- authority = "root:passwd@unsafe.org",
|
||||
-- path = "/pub/virus.exe",
|
||||
-- params = "type=i",
|
||||
-- userinfo = "root:passwd",
|
||||
-- host = "unsafe.org",
|
||||
-- user = "root",
|
||||
|
2
makefile
Normal file → Executable file
2
makefile
Normal file → Executable file
@ -10,7 +10,7 @@
|
||||
# print print the build settings
|
||||
|
||||
PLAT?= linux
|
||||
PLATS= macosx linux win32 win64 mingw freebsd solaris ucrt64
|
||||
PLATS= macosx linux win32 win64 mingw freebsd solaris
|
||||
|
||||
all: $(PLAT)
|
||||
|
||||
|
0
mime.vcxproj
Normal file → Executable file
0
mime.vcxproj
Normal file → Executable file
0
socket.vcxproj
Normal file → Executable file
0
socket.vcxproj
Normal file → Executable file
@ -207,7 +207,6 @@ local function adjusturi(reqt)
|
||||
if not reqt.proxy and not _M.PROXY then
|
||||
u = {
|
||||
path = socket.try(reqt.path, "invalid path 'nil'"),
|
||||
params = reqt.params,
|
||||
query = reqt.query,
|
||||
fragment = reqt.fragment
|
||||
}
|
||||
|
0
src/inet.c
Normal file → Executable file
0
src/inet.c
Normal file → Executable file
0
src/luasocket.c
Normal file → Executable file
0
src/luasocket.c
Normal file → Executable file
27
src/makefile
Normal file → Executable file
27
src/makefile
Normal file → Executable file
@ -74,13 +74,6 @@ LUAPREFIX_mingw?=/usr
|
||||
CDIR_mingw?=lua/$(LUAV)
|
||||
LDIR_mingw?=lua/$(LUAV)/lua
|
||||
|
||||
# where lua headers are found for ucrt64 builds
|
||||
# LUAINC_ucrt64:
|
||||
LUAINC_ucrt64?=/ucrt64/include
|
||||
LUALIB_ucrt64?=/ucrt64/bin/lua$(subst .,,$(LUAV)).dll
|
||||
LUAPREFIX_ucrt64?=/ucrt64
|
||||
CDIR_ucrt64?=lib/lua/$(LUAV)
|
||||
LDIR_ucrt64?=share/lua/$(LUAV)
|
||||
|
||||
# LUAINC_win32:
|
||||
# LUALIB_win32:
|
||||
@ -160,7 +153,7 @@ print:
|
||||
#------
|
||||
# Supported platforms
|
||||
#
|
||||
PLATS= macosx linux win32 win64 mingw solaris ucrt64
|
||||
PLATS= macosx linux win32 win64 mingw solaris
|
||||
|
||||
#------
|
||||
# Compiler and linker settings
|
||||
@ -226,21 +219,6 @@ LDFLAGS_mingw= $(LUALIB) -shared -Wl,-s -lws2_32 -o
|
||||
LD_mingw=gcc
|
||||
SOCKET_mingw=wsocket.o
|
||||
|
||||
#------
|
||||
# Compiler and linker settings
|
||||
# for ucrt64
|
||||
SO_ucrt64=dll
|
||||
O_ucrt64=o
|
||||
CC_ucrt64=gcc
|
||||
DEF_ucrt64= -DLUASOCKET_$(DEBUG) \
|
||||
-DWINVER=0x0501
|
||||
CFLAGS_ucrt64= -I$(LUAINC) $(DEF) -Wall -O2 -fno-common
|
||||
# \
|
||||
-fvisibility=hidden
|
||||
LDFLAGS_ucrt64= $(LUALIB) -shared -Wl,-s -lws2_32 -o
|
||||
LD_ucrt64=gcc
|
||||
SOCKET_ucrt64=wsocket.o
|
||||
|
||||
|
||||
#------
|
||||
# Compiler and linker settings
|
||||
@ -406,9 +384,6 @@ linux:
|
||||
mingw:
|
||||
$(MAKE) all PLAT=mingw
|
||||
|
||||
ucrt64:
|
||||
$(MAKE) all PLAT=ucrt64
|
||||
|
||||
solaris:
|
||||
$(MAKE) all-unix PLAT=solaris
|
||||
|
||||
|
0
src/mime.c
Normal file → Executable file
0
src/mime.c
Normal file → Executable file
0
src/socket.h
Normal file → Executable file
0
src/socket.h
Normal file → Executable file
@ -16,6 +16,13 @@
|
||||
|
||||
#define UNIXDGRAM_DATAGRAMSIZE 8192
|
||||
|
||||
/* provide a SUN_LEN macro if sys/un.h doesn't (e.g. Android) */
|
||||
#ifndef SUN_LEN
|
||||
#define SUN_LEN(ptr) \
|
||||
((size_t) (((struct sockaddr_un *) 0)->sun_path) \
|
||||
+ strlen ((ptr)->sun_path))
|
||||
#endif
|
||||
|
||||
/*=========================================================================*\
|
||||
* Internal function prototypes
|
||||
\*=========================================================================*/
|
||||
@ -35,8 +42,8 @@ static int meth_receivefrom(lua_State *L);
|
||||
static int meth_sendto(lua_State *L);
|
||||
static int meth_getsockname(lua_State *L);
|
||||
|
||||
static const char *unixdgram_tryconnect(p_unix un, const char *path, size_t len);
|
||||
static const char *unixdgram_trybind(p_unix un, const char *path, size_t len);
|
||||
static const char *unixdgram_tryconnect(p_unix un, const char *path);
|
||||
static const char *unixdgram_trybind(p_unix un, const char *path);
|
||||
|
||||
/* unixdgram object methods */
|
||||
static luaL_Reg unixdgram_methods[] = {
|
||||
@ -126,12 +133,13 @@ static int meth_send(lua_State *L)
|
||||
static int meth_sendto(lua_State *L)
|
||||
{
|
||||
p_unix un = (p_unix) auxiliar_checkclass(L, "unixdgram{unconnected}", 1);
|
||||
size_t count, sent, len = 0;
|
||||
size_t count, sent = 0;
|
||||
const char *data = luaL_checklstring(L, 2, &count);
|
||||
const char *path = luaL_checklstring(L, 3, &len);
|
||||
const char *path = luaL_checkstring(L, 3);
|
||||
p_timeout tm = &un->tm;
|
||||
int err;
|
||||
struct sockaddr_un remote;
|
||||
size_t len = strlen(path);
|
||||
|
||||
if (len >= sizeof(remote.sun_path)) {
|
||||
lua_pushnil(L);
|
||||
@ -140,7 +148,7 @@ static int meth_sendto(lua_State *L)
|
||||
}
|
||||
|
||||
memset(&remote, 0, sizeof(remote));
|
||||
memcpy(remote.sun_path, path, len);
|
||||
strcpy(remote.sun_path, path);
|
||||
remote.sun_family = AF_UNIX;
|
||||
timeout_markstart(tm);
|
||||
#ifdef UNIX_HAS_SUN_LEN
|
||||
@ -256,22 +264,18 @@ static int meth_dirty(lua_State *L) {
|
||||
/*-------------------------------------------------------------------------*\
|
||||
* Binds an object to an address
|
||||
\*-------------------------------------------------------------------------*/
|
||||
static const char *unixdgram_trybind(p_unix un, const char *path, size_t len) {
|
||||
static const char *unixdgram_trybind(p_unix un, const char *path) {
|
||||
struct sockaddr_un local;
|
||||
int err;
|
||||
size_t len = strlen(path);
|
||||
if (len >= sizeof(local.sun_path)) return "path too long";
|
||||
memset(&local, 0, sizeof(local));
|
||||
memcpy(local.sun_path, path, len);
|
||||
strcpy(local.sun_path, path);
|
||||
local.sun_family = AF_UNIX;
|
||||
size_t addrlen = SUN_LEN(&local);
|
||||
#ifdef UNIX_HAS_SUN_LEN
|
||||
local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len)
|
||||
+ len + 1;
|
||||
err = socket_bind(&un->sock, (SA *) &local, local.sun_len);
|
||||
|
||||
#else
|
||||
err = socket_bind(&un->sock, (SA *) &local,
|
||||
sizeof(local.sun_family) + len);
|
||||
local.sun_len = addrlen + 1;
|
||||
#endif
|
||||
int err = socket_bind(&un->sock, (SA *) &local, addrlen);
|
||||
if (err != IO_DONE) socket_destroy(&un->sock);
|
||||
return socket_strerror(err);
|
||||
}
|
||||
@ -279,9 +283,8 @@ static const char *unixdgram_trybind(p_unix un, const char *path, size_t len) {
|
||||
static int meth_bind(lua_State *L)
|
||||
{
|
||||
p_unix un = (p_unix) auxiliar_checkclass(L, "unixdgram{unconnected}", 1);
|
||||
size_t len;
|
||||
const char *path = luaL_checklstring(L, 2, &len);
|
||||
const char *err = unixdgram_trybind(un, path, len);
|
||||
const char *path = luaL_checkstring(L, 2);
|
||||
const char *err = unixdgram_trybind(un, path);
|
||||
if (err) {
|
||||
lua_pushnil(L);
|
||||
lua_pushstring(L, err);
|
||||
@ -310,23 +313,20 @@ static int meth_getsockname(lua_State *L)
|
||||
/*-------------------------------------------------------------------------*\
|
||||
* Turns a master unixdgram object into a client object.
|
||||
\*-------------------------------------------------------------------------*/
|
||||
static const char *unixdgram_tryconnect(p_unix un, const char *path, size_t len)
|
||||
static const char *unixdgram_tryconnect(p_unix un, const char *path)
|
||||
{
|
||||
struct sockaddr_un remote;
|
||||
int err;
|
||||
size_t len = strlen(path);
|
||||
if (len >= sizeof(remote.sun_path)) return "path too long";
|
||||
memset(&remote, 0, sizeof(remote));
|
||||
memcpy(remote.sun_path, path, len);
|
||||
strcpy(remote.sun_path, path);
|
||||
remote.sun_family = AF_UNIX;
|
||||
timeout_markstart(&un->tm);
|
||||
size_t addrlen = SUN_LEN(&remote);
|
||||
#ifdef UNIX_HAS_SUN_LEN
|
||||
remote.sun_len = sizeof(remote.sun_family) + sizeof(remote.sun_len)
|
||||
+ len + 1;
|
||||
err = socket_connect(&un->sock, (SA *) &remote, remote.sun_len, &un->tm);
|
||||
#else
|
||||
err = socket_connect(&un->sock, (SA *) &remote,
|
||||
sizeof(remote.sun_family) + len, &un->tm);
|
||||
remote.sun_len = addrlen + 1;
|
||||
#endif
|
||||
int err = socket_connect(&un->sock, (SA *) &remote, addrlen, &un->tm);
|
||||
if (err != IO_DONE) socket_destroy(&un->sock);
|
||||
return socket_strerror(err);
|
||||
}
|
||||
@ -334,9 +334,8 @@ static const char *unixdgram_tryconnect(p_unix un, const char *path, size_t len)
|
||||
static int meth_connect(lua_State *L)
|
||||
{
|
||||
p_unix un = (p_unix) auxiliar_checkgroup(L, "unixdgram{any}", 1);
|
||||
size_t len;
|
||||
const char *path = luaL_checklstring(L, 2, &len);
|
||||
const char *err = unixdgram_tryconnect(un, path, len);
|
||||
const char *path = luaL_checkstring(L, 2);
|
||||
const char *err = unixdgram_tryconnect(un, path);
|
||||
if (err) {
|
||||
lua_pushnil(L);
|
||||
lua_pushstring(L, err);
|
||||
|
@ -33,8 +33,8 @@ static int meth_getstats(lua_State *L);
|
||||
static int meth_setstats(lua_State *L);
|
||||
static int meth_getsockname(lua_State *L);
|
||||
|
||||
static const char *unixstream_tryconnect(p_unix un, const char *path, size_t len);
|
||||
static const char *unixstream_trybind(p_unix un, const char *path, size_t len);
|
||||
static const char *unixstream_tryconnect(p_unix un, const char *path);
|
||||
static const char *unixstream_trybind(p_unix un, const char *path);
|
||||
|
||||
/* unixstream object methods */
|
||||
static luaL_Reg unixstream_methods[] = {
|
||||
@ -181,12 +181,13 @@ static int meth_accept(lua_State *L) {
|
||||
/*-------------------------------------------------------------------------*\
|
||||
* Binds an object to an address
|
||||
\*-------------------------------------------------------------------------*/
|
||||
static const char *unixstream_trybind(p_unix un, const char *path, size_t len) {
|
||||
static const char *unixstream_trybind(p_unix un, const char *path) {
|
||||
struct sockaddr_un local;
|
||||
size_t len = strlen(path);
|
||||
int err;
|
||||
if (len >= sizeof(local.sun_path)) return "path too long";
|
||||
memset(&local, 0, sizeof(local));
|
||||
memcpy(local.sun_path, path, len);
|
||||
strcpy(local.sun_path, path);
|
||||
local.sun_family = AF_UNIX;
|
||||
#ifdef UNIX_HAS_SUN_LEN
|
||||
local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len)
|
||||
@ -203,9 +204,8 @@ static const char *unixstream_trybind(p_unix un, const char *path, size_t len) {
|
||||
|
||||
static int meth_bind(lua_State *L) {
|
||||
p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1);
|
||||
size_t len;
|
||||
const char *path = luaL_checklstring(L, 2, &len);
|
||||
const char *err = unixstream_trybind(un, path, len);
|
||||
const char *path = luaL_checkstring(L, 2);
|
||||
const char *err = unixstream_trybind(un, path);
|
||||
if (err) {
|
||||
lua_pushnil(L);
|
||||
lua_pushstring(L, err);
|
||||
@ -234,13 +234,14 @@ static int meth_getsockname(lua_State *L)
|
||||
/*-------------------------------------------------------------------------*\
|
||||
* Turns a master unixstream object into a client object.
|
||||
\*-------------------------------------------------------------------------*/
|
||||
static const char *unixstream_tryconnect(p_unix un, const char *path, size_t len)
|
||||
static const char *unixstream_tryconnect(p_unix un, const char *path)
|
||||
{
|
||||
struct sockaddr_un remote;
|
||||
int err;
|
||||
size_t len = strlen(path);
|
||||
if (len >= sizeof(remote.sun_path)) return "path too long";
|
||||
memset(&remote, 0, sizeof(remote));
|
||||
memcpy(remote.sun_path, path, len);
|
||||
strcpy(remote.sun_path, path);
|
||||
remote.sun_family = AF_UNIX;
|
||||
timeout_markstart(&un->tm);
|
||||
#ifdef UNIX_HAS_SUN_LEN
|
||||
@ -258,9 +259,8 @@ static const char *unixstream_tryconnect(p_unix un, const char *path, size_t len
|
||||
static int meth_connect(lua_State *L)
|
||||
{
|
||||
p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1);
|
||||
size_t len;
|
||||
const char *path = luaL_checklstring(L, 2, &len);
|
||||
const char *err = unixstream_tryconnect(un, path, len);
|
||||
const char *path = luaL_checkstring(L, 2);
|
||||
const char *err = unixstream_tryconnect(un, path);
|
||||
if (err) {
|
||||
lua_pushnil(L);
|
||||
lua_pushstring(L, err);
|
||||
|
13
src/url.lua
13
src/url.lua
@ -125,7 +125,7 @@ end
|
||||
-----------------------------------------------------------------------------
|
||||
-- Parses a url and returns a table with all its parts according to RFC 2396
|
||||
-- The following grammar describes the names given to the URL parts
|
||||
-- <url> ::= <scheme>://<authority>/<path>;<params>?<query>#<fragment>
|
||||
-- <url> ::= <scheme>://<authority>/<path>?<query>#<fragment>
|
||||
-- <authority> ::= <userinfo>@<host>:<port>
|
||||
-- <userinfo> ::= <user>[:<password>]
|
||||
-- <path> :: = {<segment>/}<segment>
|
||||
@ -136,7 +136,7 @@ end
|
||||
-- table with the following fields, where RFC naming conventions have
|
||||
-- been preserved:
|
||||
-- scheme, authority, userinfo, user, password, host, port,
|
||||
-- path, params, query, fragment
|
||||
-- path, query, fragment
|
||||
-- Obs:
|
||||
-- the leading '/' in {/<path>} is considered part of <path>
|
||||
-----------------------------------------------------------------------------
|
||||
@ -166,11 +166,6 @@ function _M.parse(url, default)
|
||||
parsed.query = q
|
||||
return ""
|
||||
end)
|
||||
-- get params
|
||||
url = string.gsub(url, "%;(.*)", function(p)
|
||||
parsed.params = p
|
||||
return ""
|
||||
end)
|
||||
-- path is whatever was left
|
||||
if url ~= "" then parsed.path = url end
|
||||
local authority = parsed.authority
|
||||
@ -203,7 +198,6 @@ function _M.build(parsed)
|
||||
--local ppath = _M.parse_path(parsed.path or "")
|
||||
--local url = _M.build_path(ppath)
|
||||
local url = parsed.path or ""
|
||||
if parsed.params then url = url .. ";" .. parsed.params end
|
||||
if parsed.query then url = url .. "?" .. parsed.query end
|
||||
local authority = parsed.authority
|
||||
if parsed.host then
|
||||
@ -258,12 +252,9 @@ function _M.absolute(base_url, relative_url)
|
||||
relative_parsed.authority = base_parsed.authority
|
||||
if not relative_parsed.path then
|
||||
relative_parsed.path = base_parsed.path
|
||||
if not relative_parsed.params then
|
||||
relative_parsed.params = base_parsed.params
|
||||
if not relative_parsed.query then
|
||||
relative_parsed.query = base_parsed.query
|
||||
end
|
||||
end
|
||||
else
|
||||
relative_parsed.path = absolute_path(base_parsed.path or "",
|
||||
relative_parsed.path)
|
||||
|
0
src/wsocket.c
Normal file → Executable file
0
src/wsocket.c
Normal file → Executable file
@ -99,8 +99,7 @@ check_parse_url{
|
||||
userinfo = "user:pass$%?#wd",
|
||||
password = "pass$%?#wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -113,8 +112,7 @@ check_parse_url{
|
||||
userinfo = "user:pass?#wd",
|
||||
password = "pass?#wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -127,8 +125,7 @@ check_parse_url{
|
||||
userinfo = "user:pass-wd",
|
||||
password = "pass-wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -141,8 +138,7 @@ check_parse_url{
|
||||
userinfo = "user:pass#wd",
|
||||
password = "pass#wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -155,8 +151,7 @@ check_parse_url{
|
||||
userinfo = "user:pass#wd",
|
||||
password = "pass#wd",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
}
|
||||
check_parse_url{
|
||||
@ -167,8 +162,7 @@ check_parse_url{
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -182,8 +176,7 @@ check_parse_url{
|
||||
userinfo = "user:password",
|
||||
user = "user",
|
||||
password = "password",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment",
|
||||
}
|
||||
@ -196,8 +189,7 @@ check_parse_url{
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = ""
|
||||
}
|
||||
@ -210,8 +202,7 @@ check_parse_url{
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -224,8 +215,7 @@ check_parse_url{
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
fragment = "fragment"
|
||||
}
|
||||
|
||||
@ -237,8 +227,7 @@ check_parse_url{
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "",
|
||||
path = "/path;",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -264,8 +253,7 @@ check_parse_url{
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/",
|
||||
params = "params",
|
||||
path = "/;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -287,8 +275,7 @@ check_parse_url{
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -438,8 +425,7 @@ check_parse_url{
|
||||
port = "port",
|
||||
userinfo = "userinfo",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -453,8 +439,7 @@ check_parse_url{
|
||||
userinfo = "user:password",
|
||||
user = "user",
|
||||
password = "password",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -467,8 +452,7 @@ check_build_url {
|
||||
port = "port",
|
||||
user = "user",
|
||||
password = "password",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -478,8 +462,7 @@ check_build_url{
|
||||
host = "::FFFF:129.144.52.38",
|
||||
port = "port",
|
||||
user = "userinfo",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -491,8 +474,7 @@ check_build_url{
|
||||
port = "port",
|
||||
user = "user",
|
||||
password = "password",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -503,8 +485,7 @@ check_build_url {
|
||||
host = "host",
|
||||
user = "user",
|
||||
password = "password",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -514,8 +495,7 @@ check_build_url {
|
||||
scheme = "scheme",
|
||||
host = "host",
|
||||
user = "user",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -524,8 +504,7 @@ check_build_url {
|
||||
url = "scheme://host/path;params?query#fragment",
|
||||
scheme = "scheme",
|
||||
host = "host",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -534,8 +513,7 @@ check_build_url {
|
||||
url = "scheme://host/path;params#fragment",
|
||||
scheme = "scheme",
|
||||
host = "host",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
fragment = "fragment"
|
||||
}
|
||||
|
||||
@ -573,9 +551,7 @@ check_build_url {
|
||||
user = "user",
|
||||
userinfo = "not used",
|
||||
password = "password",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
query = "query",
|
||||
path = "/path;params",
|
||||
fragment = "fragment"
|
||||
}
|
||||
|
||||
@ -588,8 +564,7 @@ check_build_url {
|
||||
userinfo = "not used",
|
||||
authority = "not used",
|
||||
password = "password",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -601,8 +576,7 @@ check_build_url {
|
||||
port = "port",
|
||||
userinfo = "user:password",
|
||||
authority = "not used",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
@ -611,8 +585,7 @@ check_build_url {
|
||||
url = "scheme://user:password@host:port/path;params?query#fragment",
|
||||
scheme = "scheme",
|
||||
authority = "user:password@host:port",
|
||||
path = "/path",
|
||||
params = "params",
|
||||
path = "/path;params",
|
||||
query = "query",
|
||||
fragment = "fragment"
|
||||
}
|
||||
|
Reference in New Issue
Block a user