rufus-lua-win 5.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +69 -0
- data/Rakefile +1 -0
- data/lib/rufus/lua/win.rb +18 -0
- data/lib/rufus/lua/win/version.rb +7 -0
- data/rufus-lua-win.gemspec +23 -0
- data/vendor/lua/bin/liblua.dll +0 -0
- data/vendor/lua/lib/lua/LuaXml.lua +119 -0
- data/vendor/lua/lib/lua/alien.lua +250 -0
- data/vendor/lua/lib/lua/alien/core.dll +0 -0
- data/vendor/lua/lib/lua/alien/struct.dll +0 -0
- data/vendor/lua/lib/lua/base.lua +536 -0
- data/vendor/lua/lib/lua/bin.lua +20 -0
- data/vendor/lua/lib/lua/bit.dll +0 -0
- data/vendor/lua/lib/lua/cdlua.dll +0 -0
- data/vendor/lua/lib/lua/cdluacontextplus.dll +0 -0
- data/vendor/lua/lib/lua/cdluagl.dll +0 -0
- data/vendor/lua/lib/lua/cdluaim.dll +0 -0
- data/vendor/lua/lib/lua/cdluapdf.dll +0 -0
- data/vendor/lua/lib/lua/copas.lua +543 -0
- data/vendor/lua/lib/lua/coxpcall.lua +57 -0
- data/vendor/lua/lib/lua/date.lua +745 -0
- data/vendor/lua/lib/lua/debug_ext.lua +84 -0
- data/vendor/lua/lib/lua/debug_init.lua +2 -0
- data/vendor/lua/lib/lua/des56.dll +0 -0
- data/vendor/lua/lib/lua/dist/config.lua +109 -0
- data/vendor/lua/lib/lua/dist/constraints.lua +271 -0
- data/vendor/lua/lib/lua/dist/depends.lua +601 -0
- data/vendor/lua/lib/lua/dist/git.lua +307 -0
- data/vendor/lua/lib/lua/dist/init.lua +278 -0
- data/vendor/lua/lib/lua/dist/manifest.lua +225 -0
- data/vendor/lua/lib/lua/dist/package.lua +583 -0
- data/vendor/lua/lib/lua/dist/sys.lua +367 -0
- data/vendor/lua/lib/lua/dist/utils.lua +130 -0
- data/vendor/lua/lib/lua/ex.dll +0 -0
- data/vendor/lua/lib/lua/fstable.lua +116 -0
- data/vendor/lua/lib/lua/getopt.lua +273 -0
- data/vendor/lua/lib/lua/git.lua +5 -0
- data/vendor/lua/lib/lua/git/core.dll +0 -0
- data/vendor/lua/lib/lua/git/objects.lua +121 -0
- data/vendor/lua/lib/lua/git/pack.lua +316 -0
- data/vendor/lua/lib/lua/git/protocol.lua +188 -0
- data/vendor/lua/lib/lua/git/repo.lua +283 -0
- data/vendor/lua/lib/lua/git/util.lua +233 -0
- data/vendor/lua/lib/lua/gzio.dll +0 -0
- data/vendor/lua/lib/lua/gzip.lua +81 -0
- data/vendor/lua/lib/lua/iconv.dll +0 -0
- data/vendor/lua/lib/lua/imlua.dll +0 -0
- data/vendor/lua/lib/lua/imlua_fftw.dll +0 -0
- data/vendor/lua/lib/lua/imlua_jp2.dll +0 -0
- data/vendor/lua/lib/lua/imlua_process.dll +0 -0
- data/vendor/lua/lib/lua/imlua_process_omp.dll +0 -0
- data/vendor/lua/lib/lua/io_ext.lua +115 -0
- data/vendor/lua/lib/lua/iuplua.dll +0 -0
- data/vendor/lua/lib/lua/iuplua_mglplot.dll +0 -0
- data/vendor/lua/lib/lua/iuplua_pplot.dll +0 -0
- data/vendor/lua/lib/lua/iupluacd.dll +0 -0
- data/vendor/lua/lib/lua/iupluacontrols.dll +0 -0
- data/vendor/lua/lib/lua/iupluagl.dll +0 -0
- data/vendor/lua/lib/lua/iupluaim.dll +0 -0
- data/vendor/lua/lib/lua/iupluaimglib.dll +0 -0
- data/vendor/lua/lib/lua/iupluatuio.dll +0 -0
- data/vendor/lua/lib/lua/lanes-keeper.lua +302 -0
- data/vendor/lua/lib/lua/lanes.lua +591 -0
- data/vendor/lua/lib/lua/lanes/core.dll +0 -0
- data/vendor/lua/lib/lua/lcs.lua +55 -0
- data/vendor/lua/lib/lua/lemock.lua +659 -0
- data/vendor/lua/lib/lua/lfs.dll +0 -0
- data/vendor/lua/lib/lua/list.lua +375 -0
- data/vendor/lua/lib/lua/logging.lua +189 -0
- data/vendor/lua/lib/lua/logging/console.lua +22 -0
- data/vendor/lua/lib/lua/logging/email.lua +44 -0
- data/vendor/lua/lib/lua/logging/file.lua +55 -0
- data/vendor/lua/lib/lua/logging/rolling_file.lua +81 -0
- data/vendor/lua/lib/lua/logging/socket.lua +35 -0
- data/vendor/lua/lib/lua/logging/sql.lua +64 -0
- data/vendor/lua/lib/lua/loop/base.lua +68 -0
- data/vendor/lua/lib/lua/loop/cached.lua +312 -0
- data/vendor/lua/lib/lua/loop/collection/MapWithArrayOfKeys.lua +64 -0
- data/vendor/lua/lib/lua/loop/collection/ObjectCache.lua +39 -0
- data/vendor/lua/lib/lua/loop/collection/OrderedSet.lua +164 -0
- data/vendor/lua/lib/lua/loop/collection/PriorityQueue.lua +86 -0
- data/vendor/lua/lib/lua/loop/collection/UnorderedArray.lua +32 -0
- data/vendor/lua/lib/lua/loop/collection/UnorderedArraySet.lua +56 -0
- data/vendor/lua/lib/lua/loop/compiler/Arguments.lua +108 -0
- data/vendor/lua/lib/lua/loop/compiler/Conditional.lua +50 -0
- data/vendor/lua/lib/lua/loop/compiler/Expression.lua +215 -0
- data/vendor/lua/lib/lua/loop/component/base.lua +221 -0
- data/vendor/lua/lib/lua/loop/component/contained.lua +71 -0
- data/vendor/lua/lib/lua/loop/component/dynamic.lua +223 -0
- data/vendor/lua/lib/lua/loop/component/intercepted.lua +354 -0
- data/vendor/lua/lib/lua/loop/component/wrapped.lua +195 -0
- data/vendor/lua/lib/lua/loop/debug/Inspector.lua +521 -0
- data/vendor/lua/lib/lua/loop/debug/Matcher.lua +192 -0
- data/vendor/lua/lib/lua/loop/debug/Verbose.lua +266 -0
- data/vendor/lua/lib/lua/loop/debug/Viewer.lua +200 -0
- data/vendor/lua/lib/lua/loop/multiple.lua +105 -0
- data/vendor/lua/lib/lua/loop/object/Exception.lua +57 -0
- data/vendor/lua/lib/lua/loop/object/Publisher.lua +43 -0
- data/vendor/lua/lib/lua/loop/object/Wrapper.lua +39 -0
- data/vendor/lua/lib/lua/loop/scoped.lua +585 -0
- data/vendor/lua/lib/lua/loop/serial/FileStream.lua +48 -0
- data/vendor/lua/lib/lua/loop/serial/Serializer.lua +291 -0
- data/vendor/lua/lib/lua/loop/serial/SocketStream.lua +51 -0
- data/vendor/lua/lib/lua/loop/serial/StringStream.lua +47 -0
- data/vendor/lua/lib/lua/loop/simple.lua +75 -0
- data/vendor/lua/lib/lua/loop/table.lua +71 -0
- data/vendor/lua/lib/lua/loop/thread/CoSocket.lua +416 -0
- data/vendor/lua/lib/lua/loop/thread/IOScheduler.lua +170 -0
- data/vendor/lua/lib/lua/loop/thread/Scheduler.lua +327 -0
- data/vendor/lua/lib/lua/loop/thread/SocketScheduler.lua +88 -0
- data/vendor/lua/lib/lua/loop/thread/Timer.lua +54 -0
- data/vendor/lua/lib/lua/lpeg.dll +0 -0
- data/vendor/lua/lib/lua/ltn12.lua +292 -0
- data/vendor/lua/lib/lua/luaXML_lib.dll +0 -0
- data/vendor/lua/lib/lua/luacurl.dll +0 -0
- data/vendor/lua/lib/lua/luadoc/config.lua +34 -0
- data/vendor/lua/lib/lua/luadoc/doclet/debug.lua +46 -0
- data/vendor/lua/lib/lua/luadoc/doclet/formatter.lua +84 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html.lua +289 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/file.lp +113 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/function.lp +64 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/index.lp +70 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/luadoc.css +286 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/menu.lp +55 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/module.lp +109 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/table.lp +15 -0
- data/vendor/lua/lib/lua/luadoc/doclet/raw.lua +12 -0
- data/vendor/lua/lib/lua/luadoc/init.lua +58 -0
- data/vendor/lua/lib/lua/luadoc/lp.lua +130 -0
- data/vendor/lua/lib/lua/luadoc/taglet/standard.lua +495 -0
- data/vendor/lua/lib/lua/luadoc/taglet/standard/tags.lua +171 -0
- data/vendor/lua/lib/lua/luadoc/util.lua +233 -0
- data/vendor/lua/lib/lua/luagl.dll +0 -0
- data/vendor/lua/lib/lua/luaglu.dll +0 -0
- data/vendor/lua/lib/lua/luaidl.lua +113 -0
- data/vendor/lua/lib/lua/luaidl/lex.lua +793 -0
- data/vendor/lua/lib/lua/luaidl/pre.lua +149 -0
- data/vendor/lua/lib/lua/luaidl/sin.lua +3631 -0
- data/vendor/lua/lib/lua/luarocks/add.lua +108 -0
- data/vendor/lua/lib/lua/luarocks/admin_remove.lua +87 -0
- data/vendor/lua/lib/lua/luarocks/build.lua +330 -0
- data/vendor/lua/lib/lua/luarocks/build/builtin.lua +253 -0
- data/vendor/lua/lib/lua/luarocks/build/cmake.lua +54 -0
- data/vendor/lua/lib/lua/luarocks/build/command.lua +32 -0
- data/vendor/lua/lib/lua/luarocks/build/make.lua +92 -0
- data/vendor/lua/lib/lua/luarocks/cache.lua +85 -0
- data/vendor/lua/lib/lua/luarocks/cfg.lua +449 -0
- data/vendor/lua/lib/lua/luarocks/command_line.lua +163 -0
- data/vendor/lua/lib/lua/luarocks/deps.lua +654 -0
- data/vendor/lua/lib/lua/luarocks/dir.lua +69 -0
- data/vendor/lua/lib/lua/luarocks/download.lua +90 -0
- data/vendor/lua/lib/lua/luarocks/fetch.lua +321 -0
- data/vendor/lua/lib/lua/luarocks/fetch/cvs.lua +44 -0
- data/vendor/lua/lib/lua/luarocks/fetch/git.lua +81 -0
- data/vendor/lua/lib/lua/luarocks/fetch/git_file.lua +17 -0
- data/vendor/lua/lib/lua/luarocks/fetch/hg.lua +54 -0
- data/vendor/lua/lib/lua/luarocks/fetch/sscm.lua +42 -0
- data/vendor/lua/lib/lua/luarocks/fetch/svn.lua +53 -0
- data/vendor/lua/lib/lua/luarocks/fs.lua +40 -0
- data/vendor/lua/lib/lua/luarocks/fs/lua.lua +676 -0
- data/vendor/lua/lib/lua/luarocks/fs/unix.lua +88 -0
- data/vendor/lua/lib/lua/luarocks/fs/unix/tools.lua +325 -0
- data/vendor/lua/lib/lua/luarocks/fs/win32.lua +107 -0
- data/vendor/lua/lib/lua/luarocks/fs/win32/tools.lua +334 -0
- data/vendor/lua/lib/lua/luarocks/help.lua +101 -0
- data/vendor/lua/lib/lua/luarocks/index.lua +172 -0
- data/vendor/lua/lib/lua/luarocks/install.lua +151 -0
- data/vendor/lua/lib/lua/luarocks/list.lua +35 -0
- data/vendor/lua/lib/lua/luarocks/loader.lua +228 -0
- data/vendor/lua/lib/lua/luarocks/make.lua +71 -0
- data/vendor/lua/lib/lua/luarocks/make_manifest.lua +34 -0
- data/vendor/lua/lib/lua/luarocks/manif.lua +360 -0
- data/vendor/lua/lib/lua/luarocks/manif_core.lua +75 -0
- data/vendor/lua/lib/lua/luarocks/new_version.lua +141 -0
- data/vendor/lua/lib/lua/luarocks/pack.lua +205 -0
- data/vendor/lua/lib/lua/luarocks/path.lua +315 -0
- data/vendor/lua/lib/lua/luarocks/persist.lua +173 -0
- data/vendor/lua/lib/lua/luarocks/refresh_cache.lua +30 -0
- data/vendor/lua/lib/lua/luarocks/remove.lua +135 -0
- data/vendor/lua/lib/lua/luarocks/rep.lua +313 -0
- data/vendor/lua/lib/lua/luarocks/require.lua +6 -0
- data/vendor/lua/lib/lua/luarocks/search.lua +399 -0
- data/vendor/lua/lib/lua/luarocks/show.lua +138 -0
- data/vendor/lua/lib/lua/luarocks/site_config.lua +23 -0
- data/vendor/lua/lib/lua/luarocks/tools/patch.lua +712 -0
- data/vendor/lua/lib/lua/luarocks/tools/tar.lua +144 -0
- data/vendor/lua/lib/lua/luarocks/tools/zip.lua +245 -0
- data/vendor/lua/lib/lua/luarocks/type_check.lua +267 -0
- data/vendor/lua/lib/lua/luarocks/unpack.lua +151 -0
- data/vendor/lua/lib/lua/luarocks/util.lua +420 -0
- data/vendor/lua/lib/lua/luarocks/validate.lua +164 -0
- data/vendor/lua/lib/lua/luars232.dll +0 -0
- data/vendor/lua/lib/lua/luasql/mysql.dll +0 -0
- data/vendor/lua/lib/lua/luasql/postgres.dll +0 -0
- data/vendor/lua/lib/lua/luasql/sqlite3.dll +0 -0
- data/vendor/lua/lib/lua/luaunit.lua +601 -0
- data/vendor/lua/lib/lua/lxp.dll +0 -0
- data/vendor/lua/lib/lua/lxp/lom.lua +60 -0
- data/vendor/lua/lib/lua/math_ext.lua +27 -0
- data/vendor/lua/lib/lua/mbox.lua +53 -0
- data/vendor/lua/lib/lua/md5.lua +19 -0
- data/vendor/lua/lib/lua/md5/core.dll +0 -0
- data/vendor/lua/lib/lua/metalua.lua +0 -0
- data/vendor/lua/lib/lua/metalua/ast_to_string.mlua +553 -0
- data/vendor/lua/lib/lua/metalua/base.lua +104 -0
- data/vendor/lua/lib/lua/metalua/bytecode.lua +0 -0
- data/vendor/lua/lib/lua/metalua/clopts.mlua +204 -0
- data/vendor/lua/lib/lua/metalua/compiler.lua +3 -0
- data/vendor/lua/lib/lua/metalua/dollar.mlua +24 -0
- data/vendor/lua/lib/lua/metalua/extension/H-runtime.mlua +216 -0
- data/vendor/lua/lib/lua/metalua/extension/H.mlua +22 -0
- data/vendor/lua/lib/lua/metalua/extension/anaphoric.mlua +54 -0
- data/vendor/lua/lib/lua/metalua/extension/clist.mlua +149 -0
- data/vendor/lua/lib/lua/metalua/extension/continue.mlua +53 -0
- data/vendor/lua/lib/lua/metalua/extension/localin.mlua +2 -0
- data/vendor/lua/lib/lua/metalua/extension/log.mlua +39 -0
- data/vendor/lua/lib/lua/metalua/extension/match.mlua +374 -0
- data/vendor/lua/lib/lua/metalua/extension/ternary.mlua +10 -0
- data/vendor/lua/lib/lua/metalua/extension/trycatch.mlua +189 -0
- data/vendor/lua/lib/lua/metalua/extension/types-runtime.mlua +159 -0
- data/vendor/lua/lib/lua/metalua/extension/types.mlua +352 -0
- data/vendor/lua/lib/lua/metalua/extension/withdo.mlua +30 -0
- data/vendor/lua/lib/lua/metalua/extension/xglobal-runtime.lua +41 -0
- data/vendor/lua/lib/lua/metalua/extension/xglobal.mlua +20 -0
- data/vendor/lua/lib/lua/metalua/extension/xloop.mlua +100 -0
- data/vendor/lua/lib/lua/metalua/extension/xmatch.mlua +216 -0
- data/vendor/lua/lib/lua/metalua/metaloop.mlua +76 -0
- data/vendor/lua/lib/lua/metalua/mlc.lua +0 -0
- data/vendor/lua/lib/lua/metalua/mlc_xcall.lua +119 -0
- data/vendor/lua/lib/lua/metalua/mlp.lua +0 -0
- data/vendor/lua/lib/lua/metalua/package2.lua +101 -0
- data/vendor/lua/lib/lua/metalua/runtime.lua +3 -0
- data/vendor/lua/lib/lua/metalua/string2.lua +44 -0
- data/vendor/lua/lib/lua/metalua/table2.lua +372 -0
- data/vendor/lua/lib/lua/metalua/walk.mlua +304 -0
- data/vendor/lua/lib/lua/metalua/walk/bindings.mlua +41 -0
- data/vendor/lua/lib/lua/metalua/walk/id.mlua +186 -0
- data/vendor/lua/lib/lua/metalua/walk/scope.lua +54 -0
- data/vendor/lua/lib/lua/mime.lua +87 -0
- data/vendor/lua/lib/lua/mime/core.dll +0 -0
- data/vendor/lua/lib/lua/mobdebug.lua +1484 -0
- data/vendor/lua/lib/lua/modules.lua +16 -0
- data/vendor/lua/lib/lua/object.lua +56 -0
- data/vendor/lua/lib/lua/oil/Exception.lua +26 -0
- data/vendor/lua/lib/lua/oil/arch.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/basic/client.lua +29 -0
- data/vendor/lua/lib/lua/oil/arch/basic/common.lua +13 -0
- data/vendor/lua/lib/lua/oil/arch/basic/server.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/cooperative/common.lua +10 -0
- data/vendor/lua/lib/lua/oil/arch/cooperative/server.lua +16 -0
- data/vendor/lua/lib/lua/oil/arch/corba/client.lua +39 -0
- data/vendor/lua/lib/lua/oil/arch/corba/common.lua +58 -0
- data/vendor/lua/lib/lua/oil/arch/corba/intercepted/client.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/corba/intercepted/server.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/corba/server.lua +35 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/byref.lua +18 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/client.lua +19 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/common.lua +18 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/server.lua +19 -0
- data/vendor/lua/lib/lua/oil/arch/typed/client.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/typed/common.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/typed/server.lua +18 -0
- data/vendor/lua/lib/lua/oil/assert.lua +87 -0
- data/vendor/lua/lib/lua/oil/builder.lua +45 -0
- data/vendor/lua/lib/lua/oil/builder/basic/client.lua +31 -0
- data/vendor/lua/lib/lua/oil/builder/basic/common.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/basic/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/cooperative/common.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/cooperative/server.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/client.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/corba/common.lua +24 -0
- data/vendor/lua/lib/lua/oil/builder/corba/gencode.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/corba/intercepted/client.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/intercepted/server.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/lua/client.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/lua/server.lua +12 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/byref.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/client.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/common.lua +14 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/typed/client.lua +16 -0
- data/vendor/lua/lib/lua/oil/builder/typed/server.lua +12 -0
- data/vendor/lua/lib/lua/oil/compat.lua +846 -0
- data/vendor/lua/lib/lua/oil/component.lua +1 -0
- data/vendor/lua/lib/lua/oil/corba/giop.lua +301 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Codec.lua +1568 -0
- data/vendor/lua/lib/lua/oil/corba/giop/CodecGen.lua +589 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Exception.lua +25 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Indexer.lua +63 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Listener.lua +343 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Messenger.lua +228 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Referrer.lua +180 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Requester.lua +462 -0
- data/vendor/lua/lib/lua/oil/corba/idl.lua +597 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Compiler.lua +133 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Importer.lua +235 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Indexer.lua +95 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Registry.lua +1821 -0
- data/vendor/lua/lib/lua/oil/corba/idl/ir.lua +847 -0
- data/vendor/lua/lib/lua/oil/corba/idl/sysex.lua +21 -0
- data/vendor/lua/lib/lua/oil/corba/iiop/Profiler.lua +200 -0
- data/vendor/lua/lib/lua/oil/corba/intercepted/Listener.lua +158 -0
- data/vendor/lua/lib/lua/oil/corba/intercepted/Requester.lua +181 -0
- data/vendor/lua/lib/lua/oil/corba/services/event.lua +126 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ConsumerAdmin.lua +50 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/EventFactory.lua +15 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/EventQueue.lua +37 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushConsumer.lua +75 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushSupplier.lua +62 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SingleDeferredDispatcher.lua +60 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SingleSynchronousDispatcher.lua +39 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SupplierAdmin.lua +50 -0
- data/vendor/lua/lib/lua/oil/corba/services/naming.lua +436 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Acceptor.lua +268 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Channels.lua +121 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Connector.lua +147 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Dispatcher.lua +99 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies.lua +86 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/asynchronous.lua +56 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/protected.lua +17 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/synchronous.lua +17 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/utils.lua +29 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Receiver.lua +110 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Servants.lua +207 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Sockets.lua +44 -0
- data/vendor/lua/lib/lua/oil/kernel/cooperative/Receiver.lua +139 -0
- data/vendor/lua/lib/lua/oil/kernel/intercepted/Listener.lua +47 -0
- data/vendor/lua/lib/lua/oil/kernel/intercepted/Requester.lua +58 -0
- data/vendor/lua/lib/lua/oil/kernel/lua/Dispatcher.lua +76 -0
- data/vendor/lua/lib/lua/oil/kernel/lua/Proxies.lua +69 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Dispatcher.lua +91 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Proxies.lua +153 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Servants.lua +137 -0
- data/vendor/lua/lib/lua/oil/ludo/Codec.lua +66 -0
- data/vendor/lua/lib/lua/oil/ludo/CodecByRef.lua +103 -0
- data/vendor/lua/lib/lua/oil/ludo/Listener.lua +151 -0
- data/vendor/lua/lib/lua/oil/ludo/Referrer.lua +72 -0
- data/vendor/lua/lib/lua/oil/ludo/Requester.lua +107 -0
- data/vendor/lua/lib/lua/oil/oo.lua +1 -0
- data/vendor/lua/lib/lua/oil/port.lua +1 -0
- data/vendor/lua/lib/lua/oil/properties.lua +57 -0
- data/vendor/lua/lib/lua/oil/verbose.lua +133 -0
- data/vendor/lua/lib/lua/package_ext.lua +15 -0
- data/vendor/lua/lib/lua/parser.lua +268 -0
- data/vendor/lua/lib/lua/pl/Date.lua +555 -0
- data/vendor/lua/lib/lua/pl/List.lua +613 -0
- data/vendor/lua/lib/lua/pl/Map.lua +113 -0
- data/vendor/lua/lib/lua/pl/MultiMap.lua +62 -0
- data/vendor/lua/lib/lua/pl/OrderedMap.lua +151 -0
- data/vendor/lua/lib/lua/pl/Set.lua +153 -0
- data/vendor/lua/lib/lua/pl/app.lua +165 -0
- data/vendor/lua/lib/lua/pl/array2d.lua +501 -0
- data/vendor/lua/lib/lua/pl/class.lua +180 -0
- data/vendor/lua/lib/lua/pl/comprehension.lua +286 -0
- data/vendor/lua/lib/lua/pl/config.lua +176 -0
- data/vendor/lua/lib/lua/pl/data.lua +606 -0
- data/vendor/lua/lib/lua/pl/dir.lua +475 -0
- data/vendor/lua/lib/lua/pl/file.lua +70 -0
- data/vendor/lua/lib/lua/pl/func.lua +376 -0
- data/vendor/lua/lib/lua/pl/init.lua +68 -0
- data/vendor/lua/lib/lua/pl/input.lua +173 -0
- data/vendor/lua/lib/lua/pl/lapp.lua +407 -0
- data/vendor/lua/lib/lua/pl/lexer.lua +456 -0
- data/vendor/lua/lib/lua/pl/luabalanced.lua +264 -0
- data/vendor/lua/lib/lua/pl/operator.lua +201 -0
- data/vendor/lua/lib/lua/pl/path.lua +398 -0
- data/vendor/lua/lib/lua/pl/permute.lua +63 -0
- data/vendor/lua/lib/lua/pl/platf/luajava.lua +101 -0
- data/vendor/lua/lib/lua/pl/pretty.lua +285 -0
- data/vendor/lua/lib/lua/pl/seq.lua +551 -0
- data/vendor/lua/lib/lua/pl/sip.lua +344 -0
- data/vendor/lua/lib/lua/pl/strict.lua +70 -0
- data/vendor/lua/lib/lua/pl/stringio.lua +158 -0
- data/vendor/lua/lib/lua/pl/stringx.lua +440 -0
- data/vendor/lua/lib/lua/pl/tablex.lua +817 -0
- data/vendor/lua/lib/lua/pl/template.lua +103 -0
- data/vendor/lua/lib/lua/pl/test.lua +135 -0
- data/vendor/lua/lib/lua/pl/text.lua +243 -0
- data/vendor/lua/lib/lua/pl/utils.lua +550 -0
- data/vendor/lua/lib/lua/pl/xml.lua +689 -0
- data/vendor/lua/lib/lua/profiler.dll +0 -0
- data/vendor/lua/lib/lua/re.lua +248 -0
- data/vendor/lua/lib/lua/rex_onig.dll +0 -0
- data/vendor/lua/lib/lua/rex_pcre.dll +0 -0
- data/vendor/lua/lib/lua/rex_posix.dll +0 -0
- data/vendor/lua/lib/lua/rings.dll +0 -0
- data/vendor/lua/lib/lua/serialize.lua +193 -0
- data/vendor/lua/lib/lua/set.lua +149 -0
- data/vendor/lua/lib/lua/socket.lua +133 -0
- data/vendor/lua/lib/lua/socket/core.dll +0 -0
- data/vendor/lua/lib/lua/socket/ftp.lua +281 -0
- data/vendor/lua/lib/lua/socket/http.lua +350 -0
- data/vendor/lua/lib/lua/socket/smtp.lua +251 -0
- data/vendor/lua/lib/lua/socket/tp.lua +123 -0
- data/vendor/lua/lib/lua/socket/url.lua +297 -0
- data/vendor/lua/lib/lua/ssl.dll +0 -0
- data/vendor/lua/lib/lua/ssl.lua +93 -0
- data/vendor/lua/lib/lua/ssl/https.lua +138 -0
- data/vendor/lua/lib/lua/stable.lua +28 -0
- data/vendor/lua/lib/lua/std.lua +16 -0
- data/vendor/lua/lib/lua/strbuf.lua +32 -0
- data/vendor/lua/lib/lua/strict.lua +45 -0
- data/vendor/lua/lib/lua/string_ext.lua +274 -0
- data/vendor/lua/lib/lua/table_ext.lua +117 -0
- data/vendor/lua/lib/lua/tar.lua +262 -0
- data/vendor/lua/lib/lua/task.dll +0 -0
- data/vendor/lua/lib/lua/tree.lua +81 -0
- data/vendor/lua/lib/lua/unicode.dll +0 -0
- data/vendor/lua/lib/lua/verbose_require.lua +11 -0
- data/vendor/lua/lib/lua/vstruct.lua +86 -0
- data/vendor/lua/lib/lua/vstruct/ast.lua +192 -0
- data/vendor/lua/lib/lua/vstruct/ast/Bitpack.lua +33 -0
- data/vendor/lua/lib/lua/vstruct/ast/Generator.lua +174 -0
- data/vendor/lua/lib/lua/vstruct/ast/IO.lua +45 -0
- data/vendor/lua/lib/lua/vstruct/ast/List.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/ast/Name.lua +20 -0
- data/vendor/lua/lib/lua/vstruct/ast/Repeat.lua +23 -0
- data/vendor/lua/lib/lua/vstruct/ast/Root.lua +19 -0
- data/vendor/lua/lib/lua/vstruct/ast/Table.lua +65 -0
- data/vendor/lua/lib/lua/vstruct/cursor.lua +81 -0
- data/vendor/lua/lib/lua/vstruct/io.lua +45 -0
- data/vendor/lua/lib/lua/vstruct/io/a.lua +24 -0
- data/vendor/lua/lib/lua/vstruct/io/b.lua +28 -0
- data/vendor/lua/lib/lua/vstruct/io/bigendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/c.lua +25 -0
- data/vendor/lua/lib/lua/vstruct/io/defaults.lua +24 -0
- data/vendor/lua/lib/lua/vstruct/io/endianness.lua +41 -0
- data/vendor/lua/lib/lua/vstruct/io/f.lua +129 -0
- data/vendor/lua/lib/lua/vstruct/io/hostendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/i.lua +42 -0
- data/vendor/lua/lib/lua/vstruct/io/littleendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/m.lua +62 -0
- data/vendor/lua/lib/lua/vstruct/io/p.lua +23 -0
- data/vendor/lua/lib/lua/vstruct/io/s.lua +27 -0
- data/vendor/lua/lib/lua/vstruct/io/seekb.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/seekf.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/seekto.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/u.lua +54 -0
- data/vendor/lua/lib/lua/vstruct/io/x.lua +34 -0
- data/vendor/lua/lib/lua/vstruct/io/z.lua +63 -0
- data/vendor/lua/lib/lua/vstruct/lexer.lua +100 -0
- data/vendor/lua/lib/lua/vstruct/pack.lua +142 -0
- data/vendor/lua/lib/lua/vstruct/test.lua +47 -0
- data/vendor/lua/lib/lua/vstruct/test/basic.lua +73 -0
- data/vendor/lua/lib/lua/vstruct/test/common.lua +100 -0
- data/vendor/lua/lib/lua/vstruct/test/fp-bigendian.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/test/fp-littleendian.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/test/struct-test-gen.lua +1230 -0
- data/vendor/lua/lib/lua/vstruct/unpack.lua +126 -0
- data/vendor/lua/lib/lua/wx.dll +0 -0
- data/vendor/lua/lib/lua/xml.lua +75 -0
- data/vendor/lua/lib/lua/zip.dll +0 -0
- data/vendor/lua/lib/lua/zlib.dll +0 -0
- metadata +529 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
-----------------------------------------------------------------------------
|
|
2
|
+
-- HTTP/1.1 client support for the Lua language.
|
|
3
|
+
-- LuaSocket toolkit.
|
|
4
|
+
-- Author: Diego Nehab
|
|
5
|
+
-- RCS ID: $Id$
|
|
6
|
+
-----------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------------------------
|
|
9
|
+
-- Declare module and import dependencies
|
|
10
|
+
-------------------------------------------------------------------------------
|
|
11
|
+
local socket = require("socket")
|
|
12
|
+
local url = require("socket.url")
|
|
13
|
+
local ltn12 = require("ltn12")
|
|
14
|
+
local mime = require("mime")
|
|
15
|
+
local string = require("string")
|
|
16
|
+
local base = _G
|
|
17
|
+
local table = require("table")
|
|
18
|
+
module("socket.http")
|
|
19
|
+
|
|
20
|
+
-----------------------------------------------------------------------------
|
|
21
|
+
-- Program constants
|
|
22
|
+
-----------------------------------------------------------------------------
|
|
23
|
+
-- connection timeout in seconds
|
|
24
|
+
TIMEOUT = 60
|
|
25
|
+
-- default port for document retrieval
|
|
26
|
+
PORT = 80
|
|
27
|
+
-- user agent field sent in request
|
|
28
|
+
USERAGENT = socket._VERSION
|
|
29
|
+
|
|
30
|
+
-----------------------------------------------------------------------------
|
|
31
|
+
-- Reads MIME headers from a connection, unfolding where needed
|
|
32
|
+
-----------------------------------------------------------------------------
|
|
33
|
+
local function receiveheaders(sock, headers)
|
|
34
|
+
local line, name, value, err
|
|
35
|
+
headers = headers or {}
|
|
36
|
+
-- get first line
|
|
37
|
+
line, err = sock:receive()
|
|
38
|
+
if err then return nil, err end
|
|
39
|
+
-- headers go until a blank line is found
|
|
40
|
+
while line ~= "" do
|
|
41
|
+
-- get field-name and value
|
|
42
|
+
name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)"))
|
|
43
|
+
if not (name and value) then return nil, "malformed reponse headers" end
|
|
44
|
+
name = string.lower(name)
|
|
45
|
+
-- get next line (value might be folded)
|
|
46
|
+
line, err = sock:receive()
|
|
47
|
+
if err then return nil, err end
|
|
48
|
+
-- unfold any folded values
|
|
49
|
+
while string.find(line, "^%s") do
|
|
50
|
+
value = value .. line
|
|
51
|
+
line = sock:receive()
|
|
52
|
+
if err then return nil, err end
|
|
53
|
+
end
|
|
54
|
+
-- save pair in table
|
|
55
|
+
if headers[name] then headers[name] = headers[name] .. ", " .. value
|
|
56
|
+
else headers[name] = value end
|
|
57
|
+
end
|
|
58
|
+
return headers
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
-----------------------------------------------------------------------------
|
|
62
|
+
-- Extra sources and sinks
|
|
63
|
+
-----------------------------------------------------------------------------
|
|
64
|
+
socket.sourcet["http-chunked"] = function(sock, headers)
|
|
65
|
+
return base.setmetatable({
|
|
66
|
+
getfd = function() return sock:getfd() end,
|
|
67
|
+
dirty = function() return sock:dirty() end
|
|
68
|
+
}, {
|
|
69
|
+
__call = function()
|
|
70
|
+
-- get chunk size, skip extention
|
|
71
|
+
local line, err = sock:receive()
|
|
72
|
+
if err then return nil, err end
|
|
73
|
+
local size = base.tonumber(string.gsub(line, ";.*", ""), 16)
|
|
74
|
+
if not size then return nil, "invalid chunk size" end
|
|
75
|
+
-- was it the last chunk?
|
|
76
|
+
if size > 0 then
|
|
77
|
+
-- if not, get chunk and skip terminating CRLF
|
|
78
|
+
local chunk, err, part = sock:receive(size)
|
|
79
|
+
if chunk then sock:receive() end
|
|
80
|
+
return chunk, err
|
|
81
|
+
else
|
|
82
|
+
-- if it was, read trailers into headers table
|
|
83
|
+
headers, err = receiveheaders(sock, headers)
|
|
84
|
+
if not headers then return nil, err end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
})
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
socket.sinkt["http-chunked"] = function(sock)
|
|
91
|
+
return base.setmetatable({
|
|
92
|
+
getfd = function() return sock:getfd() end,
|
|
93
|
+
dirty = function() return sock:dirty() end
|
|
94
|
+
}, {
|
|
95
|
+
__call = function(self, chunk, err)
|
|
96
|
+
if not chunk then return sock:send("0\r\n\r\n") end
|
|
97
|
+
local size = string.format("%X\r\n", string.len(chunk))
|
|
98
|
+
return sock:send(size .. chunk .. "\r\n")
|
|
99
|
+
end
|
|
100
|
+
})
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
-----------------------------------------------------------------------------
|
|
104
|
+
-- Low level HTTP API
|
|
105
|
+
-----------------------------------------------------------------------------
|
|
106
|
+
local metat = { __index = {} }
|
|
107
|
+
|
|
108
|
+
function open(host, port, create)
|
|
109
|
+
-- create socket with user connect function, or with default
|
|
110
|
+
local c = socket.try((create or socket.tcp)())
|
|
111
|
+
local h = base.setmetatable({ c = c }, metat)
|
|
112
|
+
-- create finalized try
|
|
113
|
+
h.try = socket.newtry(function() h:close() end)
|
|
114
|
+
-- set timeout before connecting
|
|
115
|
+
h.try(c:settimeout(TIMEOUT))
|
|
116
|
+
h.try(c:connect(host, port or PORT))
|
|
117
|
+
-- here everything worked
|
|
118
|
+
return h
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
function metat.__index:sendrequestline(method, uri)
|
|
122
|
+
local reqline = string.format("%s %s HTTP/1.1\r\n", method or "GET", uri)
|
|
123
|
+
return self.try(self.c:send(reqline))
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
function metat.__index:sendheaders(headers)
|
|
127
|
+
local h = "\r\n"
|
|
128
|
+
for i, v in base.pairs(headers) do
|
|
129
|
+
h = i .. ": " .. v .. "\r\n" .. h
|
|
130
|
+
end
|
|
131
|
+
self.try(self.c:send(h))
|
|
132
|
+
return 1
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
function metat.__index:sendbody(headers, source, step)
|
|
136
|
+
source = source or ltn12.source.empty()
|
|
137
|
+
step = step or ltn12.pump.step
|
|
138
|
+
-- if we don't know the size in advance, send chunked and hope for the best
|
|
139
|
+
local mode = "http-chunked"
|
|
140
|
+
if headers["content-length"] then mode = "keep-open" end
|
|
141
|
+
return self.try(ltn12.pump.all(source, socket.sink(mode, self.c), step))
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
function metat.__index:receivestatusline()
|
|
145
|
+
local status = self.try(self.c:receive(5))
|
|
146
|
+
-- identify HTTP/0.9 responses, which do not contain a status line
|
|
147
|
+
-- this is just a heuristic, but is what the RFC recommends
|
|
148
|
+
if status ~= "HTTP/" then return nil, status end
|
|
149
|
+
-- otherwise proceed reading a status line
|
|
150
|
+
status = self.try(self.c:receive("*l", status))
|
|
151
|
+
local code = socket.skip(2, string.find(status, "HTTP/%d*%.%d* (%d%d%d)"))
|
|
152
|
+
return self.try(base.tonumber(code), status)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
function metat.__index:receiveheaders()
|
|
156
|
+
return self.try(receiveheaders(self.c))
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
function metat.__index:receivebody(headers, sink, step)
|
|
160
|
+
sink = sink or ltn12.sink.null()
|
|
161
|
+
step = step or ltn12.pump.step
|
|
162
|
+
local length = base.tonumber(headers["content-length"])
|
|
163
|
+
local t = headers["transfer-encoding"] -- shortcut
|
|
164
|
+
local mode = "default" -- connection close
|
|
165
|
+
if t and t ~= "identity" then mode = "http-chunked"
|
|
166
|
+
elseif base.tonumber(headers["content-length"]) then mode = "by-length" end
|
|
167
|
+
return self.try(ltn12.pump.all(socket.source(mode, self.c, length),
|
|
168
|
+
sink, step))
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
function metat.__index:receive09body(status, sink, step)
|
|
172
|
+
local source = ltn12.source.rewind(socket.source("until-closed", self.c))
|
|
173
|
+
source(status)
|
|
174
|
+
return self.try(ltn12.pump.all(source, sink, step))
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
function metat.__index:close()
|
|
178
|
+
return self.c:close()
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
-----------------------------------------------------------------------------
|
|
182
|
+
-- High level HTTP API
|
|
183
|
+
-----------------------------------------------------------------------------
|
|
184
|
+
local function adjusturi(reqt)
|
|
185
|
+
local u = reqt
|
|
186
|
+
-- if there is a proxy, we need the full url. otherwise, just a part.
|
|
187
|
+
if not reqt.proxy and not PROXY then
|
|
188
|
+
u = {
|
|
189
|
+
path = socket.try(reqt.path, "invalid path 'nil'"),
|
|
190
|
+
params = reqt.params,
|
|
191
|
+
query = reqt.query,
|
|
192
|
+
fragment = reqt.fragment
|
|
193
|
+
}
|
|
194
|
+
end
|
|
195
|
+
return url.build(u)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
local function adjustproxy(reqt)
|
|
199
|
+
local proxy = reqt.proxy or PROXY
|
|
200
|
+
if proxy then
|
|
201
|
+
proxy = url.parse(proxy)
|
|
202
|
+
return proxy.host, proxy.port or 3128
|
|
203
|
+
else
|
|
204
|
+
return reqt.host, reqt.port
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
local function adjustheaders(reqt)
|
|
209
|
+
-- default headers
|
|
210
|
+
local lower = {
|
|
211
|
+
["user-agent"] = USERAGENT,
|
|
212
|
+
["host"] = reqt.host,
|
|
213
|
+
["connection"] = "close, TE",
|
|
214
|
+
["te"] = "trailers"
|
|
215
|
+
}
|
|
216
|
+
-- if we have authentication information, pass it along
|
|
217
|
+
if reqt.user and reqt.password then
|
|
218
|
+
lower["authorization"] =
|
|
219
|
+
"Basic " .. (mime.b64(reqt.user .. ":" .. reqt.password))
|
|
220
|
+
end
|
|
221
|
+
-- override with user headers
|
|
222
|
+
for i,v in base.pairs(reqt.headers or lower) do
|
|
223
|
+
lower[string.lower(i)] = v
|
|
224
|
+
end
|
|
225
|
+
return lower
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
-- default url parts
|
|
229
|
+
local default = {
|
|
230
|
+
host = "",
|
|
231
|
+
port = PORT,
|
|
232
|
+
path ="/",
|
|
233
|
+
scheme = "http"
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
local function adjustrequest(reqt)
|
|
237
|
+
-- parse url if provided
|
|
238
|
+
local nreqt = reqt.url and url.parse(reqt.url, default) or {}
|
|
239
|
+
-- explicit components override url
|
|
240
|
+
for i,v in base.pairs(reqt) do nreqt[i] = v end
|
|
241
|
+
if nreqt.port == "" then nreqt.port = 80 end
|
|
242
|
+
socket.try(nreqt.host and nreqt.host ~= "",
|
|
243
|
+
"invalid host '" .. base.tostring(nreqt.host) .. "'")
|
|
244
|
+
-- compute uri if user hasn't overriden
|
|
245
|
+
nreqt.uri = reqt.uri or adjusturi(nreqt)
|
|
246
|
+
-- ajust host and port if there is a proxy
|
|
247
|
+
nreqt.host, nreqt.port = adjustproxy(nreqt)
|
|
248
|
+
-- adjust headers in request
|
|
249
|
+
nreqt.headers = adjustheaders(nreqt)
|
|
250
|
+
return nreqt
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
local function shouldredirect(reqt, code, headers)
|
|
254
|
+
return headers.location and
|
|
255
|
+
string.gsub(headers.location, "%s", "") ~= "" and
|
|
256
|
+
(reqt.redirect ~= false) and
|
|
257
|
+
(code == 301 or code == 302) and
|
|
258
|
+
(not reqt.method or reqt.method == "GET" or reqt.method == "HEAD")
|
|
259
|
+
and (not reqt.nredirects or reqt.nredirects < 5)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
local function shouldreceivebody(reqt, code)
|
|
263
|
+
if reqt.method == "HEAD" then return nil end
|
|
264
|
+
if code == 204 or code == 304 then return nil end
|
|
265
|
+
if code >= 100 and code < 200 then return nil end
|
|
266
|
+
return 1
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
-- forward declarations
|
|
270
|
+
local trequest, tredirect
|
|
271
|
+
|
|
272
|
+
function tredirect(reqt, location)
|
|
273
|
+
local result, code, headers, status = trequest {
|
|
274
|
+
-- the RFC says the redirect URL has to be absolute, but some
|
|
275
|
+
-- servers do not respect that
|
|
276
|
+
url = url.absolute(reqt.url, location),
|
|
277
|
+
source = reqt.source,
|
|
278
|
+
sink = reqt.sink,
|
|
279
|
+
headers = reqt.headers,
|
|
280
|
+
proxy = reqt.proxy,
|
|
281
|
+
nredirects = (reqt.nredirects or 0) + 1,
|
|
282
|
+
create = reqt.create
|
|
283
|
+
}
|
|
284
|
+
-- pass location header back as a hint we redirected
|
|
285
|
+
headers = headers or {}
|
|
286
|
+
headers.location = headers.location or location
|
|
287
|
+
return result, code, headers, status
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
function trequest(reqt)
|
|
291
|
+
-- we loop until we get what we want, or
|
|
292
|
+
-- until we are sure there is no way to get it
|
|
293
|
+
local nreqt = adjustrequest(reqt)
|
|
294
|
+
local h = open(nreqt.host, nreqt.port, nreqt.create)
|
|
295
|
+
-- send request line and headers
|
|
296
|
+
h:sendrequestline(nreqt.method, nreqt.uri)
|
|
297
|
+
h:sendheaders(nreqt.headers)
|
|
298
|
+
-- if there is a body, send it
|
|
299
|
+
if nreqt.source then
|
|
300
|
+
h:sendbody(nreqt.headers, nreqt.source, nreqt.step)
|
|
301
|
+
end
|
|
302
|
+
local code, status = h:receivestatusline()
|
|
303
|
+
-- if it is an HTTP/0.9 server, simply get the body and we are done
|
|
304
|
+
if not code then
|
|
305
|
+
h:receive09body(status, nreqt.sink, nreqt.step)
|
|
306
|
+
return 1, 200
|
|
307
|
+
end
|
|
308
|
+
local headers
|
|
309
|
+
-- ignore any 100-continue messages
|
|
310
|
+
while code == 100 do
|
|
311
|
+
headers = h:receiveheaders()
|
|
312
|
+
code, status = h:receivestatusline()
|
|
313
|
+
end
|
|
314
|
+
headers = h:receiveheaders()
|
|
315
|
+
-- at this point we should have a honest reply from the server
|
|
316
|
+
-- we can't redirect if we already used the source, so we report the error
|
|
317
|
+
if shouldredirect(nreqt, code, headers) and not nreqt.source then
|
|
318
|
+
h:close()
|
|
319
|
+
return tredirect(reqt, headers.location)
|
|
320
|
+
end
|
|
321
|
+
-- here we are finally done
|
|
322
|
+
if shouldreceivebody(nreqt, code) then
|
|
323
|
+
h:receivebody(headers, nreqt.sink, nreqt.step)
|
|
324
|
+
end
|
|
325
|
+
h:close()
|
|
326
|
+
return 1, code, headers, status
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
local function srequest(u, b)
|
|
330
|
+
local t = {}
|
|
331
|
+
local reqt = {
|
|
332
|
+
url = u,
|
|
333
|
+
sink = ltn12.sink.table(t)
|
|
334
|
+
}
|
|
335
|
+
if b then
|
|
336
|
+
reqt.source = ltn12.source.string(b)
|
|
337
|
+
reqt.headers = {
|
|
338
|
+
["content-length"] = string.len(b),
|
|
339
|
+
["content-type"] = "application/x-www-form-urlencoded"
|
|
340
|
+
}
|
|
341
|
+
reqt.method = "POST"
|
|
342
|
+
end
|
|
343
|
+
local code, headers, status = socket.skip(1, trequest(reqt))
|
|
344
|
+
return table.concat(t), code, headers, status
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
request = socket.protect(function(reqt, body)
|
|
348
|
+
if base.type(reqt) == "string" then return srequest(reqt, body)
|
|
349
|
+
else return trequest(reqt) end
|
|
350
|
+
end)
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
-----------------------------------------------------------------------------
|
|
2
|
+
-- SMTP client support for the Lua language.
|
|
3
|
+
-- LuaSocket toolkit.
|
|
4
|
+
-- Author: Diego Nehab
|
|
5
|
+
-- RCS ID: $Id$
|
|
6
|
+
-----------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------------------------
|
|
9
|
+
-- Declare module and import dependencies
|
|
10
|
+
-----------------------------------------------------------------------------
|
|
11
|
+
local base = _G
|
|
12
|
+
local coroutine = require("coroutine")
|
|
13
|
+
local string = require("string")
|
|
14
|
+
local math = require("math")
|
|
15
|
+
local os = require("os")
|
|
16
|
+
local socket = require("socket")
|
|
17
|
+
local tp = require("socket.tp")
|
|
18
|
+
local ltn12 = require("ltn12")
|
|
19
|
+
local mime = require("mime")
|
|
20
|
+
module("socket.smtp")
|
|
21
|
+
|
|
22
|
+
-----------------------------------------------------------------------------
|
|
23
|
+
-- Program constants
|
|
24
|
+
-----------------------------------------------------------------------------
|
|
25
|
+
-- timeout for connection
|
|
26
|
+
TIMEOUT = 60
|
|
27
|
+
-- default server used to send e-mails
|
|
28
|
+
SERVER = "localhost"
|
|
29
|
+
-- default port
|
|
30
|
+
PORT = 25
|
|
31
|
+
-- domain used in HELO command and default sendmail
|
|
32
|
+
-- If we are under a CGI, try to get from environment
|
|
33
|
+
DOMAIN = os.getenv("SERVER_NAME") or "localhost"
|
|
34
|
+
-- default time zone (means we don't know)
|
|
35
|
+
ZONE = "-0000"
|
|
36
|
+
|
|
37
|
+
---------------------------------------------------------------------------
|
|
38
|
+
-- Low level SMTP API
|
|
39
|
+
-----------------------------------------------------------------------------
|
|
40
|
+
local metat = { __index = {} }
|
|
41
|
+
|
|
42
|
+
function metat.__index:greet(domain)
|
|
43
|
+
self.try(self.tp:check("2.."))
|
|
44
|
+
self.try(self.tp:command("EHLO", domain or DOMAIN))
|
|
45
|
+
return socket.skip(1, self.try(self.tp:check("2..")))
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
function metat.__index:mail(from)
|
|
49
|
+
self.try(self.tp:command("MAIL", "FROM:" .. from))
|
|
50
|
+
return self.try(self.tp:check("2.."))
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
function metat.__index:rcpt(to)
|
|
54
|
+
self.try(self.tp:command("RCPT", "TO:" .. to))
|
|
55
|
+
return self.try(self.tp:check("2.."))
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
function metat.__index:data(src, step)
|
|
59
|
+
self.try(self.tp:command("DATA"))
|
|
60
|
+
self.try(self.tp:check("3.."))
|
|
61
|
+
self.try(self.tp:source(src, step))
|
|
62
|
+
self.try(self.tp:send("\r\n.\r\n"))
|
|
63
|
+
return self.try(self.tp:check("2.."))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
function metat.__index:quit()
|
|
67
|
+
self.try(self.tp:command("QUIT"))
|
|
68
|
+
return self.try(self.tp:check("2.."))
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
function metat.__index:close()
|
|
72
|
+
return self.tp:close()
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
function metat.__index:login(user, password)
|
|
76
|
+
self.try(self.tp:command("AUTH", "LOGIN"))
|
|
77
|
+
self.try(self.tp:check("3.."))
|
|
78
|
+
self.try(self.tp:command(mime.b64(user)))
|
|
79
|
+
self.try(self.tp:check("3.."))
|
|
80
|
+
self.try(self.tp:command(mime.b64(password)))
|
|
81
|
+
return self.try(self.tp:check("2.."))
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
function metat.__index:plain(user, password)
|
|
85
|
+
local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password)
|
|
86
|
+
self.try(self.tp:command("AUTH", auth))
|
|
87
|
+
return self.try(self.tp:check("2.."))
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
function metat.__index:auth(user, password, ext)
|
|
91
|
+
if not user or not password then return 1 end
|
|
92
|
+
if string.find(ext, "AUTH[^\n]+LOGIN") then
|
|
93
|
+
return self:login(user, password)
|
|
94
|
+
elseif string.find(ext, "AUTH[^\n]+PLAIN") then
|
|
95
|
+
return self:plain(user, password)
|
|
96
|
+
else
|
|
97
|
+
self.try(nil, "authentication not supported")
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
-- send message or throw an exception
|
|
102
|
+
function metat.__index:send(mailt)
|
|
103
|
+
self:mail(mailt.from)
|
|
104
|
+
if base.type(mailt.rcpt) == "table" then
|
|
105
|
+
for i,v in base.ipairs(mailt.rcpt) do
|
|
106
|
+
self:rcpt(v)
|
|
107
|
+
end
|
|
108
|
+
else
|
|
109
|
+
self:rcpt(mailt.rcpt)
|
|
110
|
+
end
|
|
111
|
+
self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
function open(server, port, create)
|
|
115
|
+
local tp = socket.try(tp.connect(server or SERVER, port or PORT,
|
|
116
|
+
TIMEOUT, create))
|
|
117
|
+
local s = base.setmetatable({tp = tp}, metat)
|
|
118
|
+
-- make sure tp is closed if we get an exception
|
|
119
|
+
s.try = socket.newtry(function()
|
|
120
|
+
s:close()
|
|
121
|
+
end)
|
|
122
|
+
return s
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
-- convert headers to lowercase
|
|
126
|
+
local function lower_headers(headers)
|
|
127
|
+
local lower = {}
|
|
128
|
+
for i,v in base.pairs(headers or lower) do
|
|
129
|
+
lower[string.lower(i)] = v
|
|
130
|
+
end
|
|
131
|
+
return lower
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
---------------------------------------------------------------------------
|
|
135
|
+
-- Multipart message source
|
|
136
|
+
-----------------------------------------------------------------------------
|
|
137
|
+
-- returns a hopefully unique mime boundary
|
|
138
|
+
local seqno = 0
|
|
139
|
+
local function newboundary()
|
|
140
|
+
seqno = seqno + 1
|
|
141
|
+
return string.format('%s%05d==%05u', os.date('%d%m%Y%H%M%S'),
|
|
142
|
+
math.random(0, 99999), seqno)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
-- send_message forward declaration
|
|
146
|
+
local send_message
|
|
147
|
+
|
|
148
|
+
-- yield the headers all at once, it's faster
|
|
149
|
+
local function send_headers(headers)
|
|
150
|
+
local h = "\r\n"
|
|
151
|
+
for i,v in base.pairs(headers) do
|
|
152
|
+
h = i .. ': ' .. v .. "\r\n" .. h
|
|
153
|
+
end
|
|
154
|
+
coroutine.yield(h)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
-- yield multipart message body from a multipart message table
|
|
158
|
+
local function send_multipart(mesgt)
|
|
159
|
+
-- make sure we have our boundary and send headers
|
|
160
|
+
local bd = newboundary()
|
|
161
|
+
local headers = lower_headers(mesgt.headers or {})
|
|
162
|
+
headers['content-type'] = headers['content-type'] or 'multipart/mixed'
|
|
163
|
+
headers['content-type'] = headers['content-type'] ..
|
|
164
|
+
'; boundary="' .. bd .. '"'
|
|
165
|
+
send_headers(headers)
|
|
166
|
+
-- send preamble
|
|
167
|
+
if mesgt.body.preamble then
|
|
168
|
+
coroutine.yield(mesgt.body.preamble)
|
|
169
|
+
coroutine.yield("\r\n")
|
|
170
|
+
end
|
|
171
|
+
-- send each part separated by a boundary
|
|
172
|
+
for i, m in base.ipairs(mesgt.body) do
|
|
173
|
+
coroutine.yield("\r\n--" .. bd .. "\r\n")
|
|
174
|
+
send_message(m)
|
|
175
|
+
end
|
|
176
|
+
-- send last boundary
|
|
177
|
+
coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n")
|
|
178
|
+
-- send epilogue
|
|
179
|
+
if mesgt.body.epilogue then
|
|
180
|
+
coroutine.yield(mesgt.body.epilogue)
|
|
181
|
+
coroutine.yield("\r\n")
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
-- yield message body from a source
|
|
186
|
+
local function send_source(mesgt)
|
|
187
|
+
-- make sure we have a content-type
|
|
188
|
+
local headers = lower_headers(mesgt.headers or {})
|
|
189
|
+
headers['content-type'] = headers['content-type'] or
|
|
190
|
+
'text/plain; charset="iso-8859-1"'
|
|
191
|
+
send_headers(headers)
|
|
192
|
+
-- send body from source
|
|
193
|
+
while true do
|
|
194
|
+
local chunk, err = mesgt.body()
|
|
195
|
+
if err then coroutine.yield(nil, err)
|
|
196
|
+
elseif chunk then coroutine.yield(chunk)
|
|
197
|
+
else break end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
-- yield message body from a string
|
|
202
|
+
local function send_string(mesgt)
|
|
203
|
+
-- make sure we have a content-type
|
|
204
|
+
local headers = lower_headers(mesgt.headers or {})
|
|
205
|
+
headers['content-type'] = headers['content-type'] or
|
|
206
|
+
'text/plain; charset="iso-8859-1"'
|
|
207
|
+
send_headers(headers)
|
|
208
|
+
-- send body from string
|
|
209
|
+
coroutine.yield(mesgt.body)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
-- message source
|
|
213
|
+
function send_message(mesgt)
|
|
214
|
+
if base.type(mesgt.body) == "table" then send_multipart(mesgt)
|
|
215
|
+
elseif base.type(mesgt.body) == "function" then send_source(mesgt)
|
|
216
|
+
else send_string(mesgt) end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
-- set defaul headers
|
|
220
|
+
local function adjust_headers(mesgt)
|
|
221
|
+
local lower = lower_headers(mesgt.headers)
|
|
222
|
+
lower["date"] = lower["date"] or
|
|
223
|
+
os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or ZONE)
|
|
224
|
+
lower["x-mailer"] = lower["x-mailer"] or socket._VERSION
|
|
225
|
+
-- this can't be overriden
|
|
226
|
+
lower["mime-version"] = "1.0"
|
|
227
|
+
return lower
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
function message(mesgt)
|
|
231
|
+
mesgt.headers = adjust_headers(mesgt)
|
|
232
|
+
-- create and return message source
|
|
233
|
+
local co = coroutine.create(function() send_message(mesgt) end)
|
|
234
|
+
return function()
|
|
235
|
+
local ret, a, b = coroutine.resume(co)
|
|
236
|
+
if ret then return a, b
|
|
237
|
+
else return nil, a end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
---------------------------------------------------------------------------
|
|
242
|
+
-- High level SMTP API
|
|
243
|
+
-----------------------------------------------------------------------------
|
|
244
|
+
send = socket.protect(function(mailt)
|
|
245
|
+
local s = open(mailt.server, mailt.port, mailt.create)
|
|
246
|
+
local ext = s:greet(mailt.domain)
|
|
247
|
+
s:auth(mailt.user, mailt.password, ext)
|
|
248
|
+
s:send(mailt)
|
|
249
|
+
s:quit()
|
|
250
|
+
return s:close()
|
|
251
|
+
end)
|