Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fails with "module 'socket.http' not found" if LuaSec is not installed #404

Open
sarna opened this issue Jun 30, 2023 · 0 comments
Open

Comments

@sarna
Copy link

sarna commented Jun 30, 2023

Requiring the library fails immediately with an unhelpful message if LuaSec is not installed:

$ cat foo.lua
http = require("socket.http")
$ lua -l set_paths foo.lua
lua: foo.lua:1: module 'socket.http' not found:
	no field package.preload['socket.http']
	no file 'lua_modules/share/lua/5.3/socket/http.lua'
	no file 'lua_modules/share/lua/5.3/socket/http/init.lua'
	no file '/opt/local/share/lua/5.3/socket/http.lua'
	no file '/opt/local/share/lua/5.3/socket/http/init.lua'
	no file '/opt/local/lib/lua/5.3/socket/http.lua'
	no file '/opt/local/lib/lua/5.3/socket/http/init.lua'
	no file './socket/http.lua'
	no file './socket/http/init.lua'
	no file 'lua_modules/lib/lua/5.3/socket/http.so'
	no file '/opt/local/lib/lua/5.3/socket/http.so'
	no file '/opt/local/lib/lua/5.3/loadall.so'
	no file './socket/http.so'
	no file 'lua_modules/lib/lua/5.3/socket.so'
	no file '/opt/local/lib/lua/5.3/socket.so'
	no file '/opt/local/lib/lua/5.3/loadall.so'
	no file './socket.so'
stack traceback:
	[C]: in function 'require'
	foo.lua:1: in main chunk
	[C]: in ?

set_paths is just a helper script that adds stuff in lua_modules to package.[c]path:

$ cat set_paths.lua
local version = _VERSION:match("%d+%.%d+")
package.path = 'lua_modules/share/lua/' .. version .. '/?.lua;lua_modules/share/lua/' .. version .. '/?/init.lua;' .. package.path
package.cpath = 'lua_modules/lib/lua/' .. version .. '/?.so;' .. package.cpath

In 2a46700 there was an attempt to fail with an informative error if LuaSec is not present - this fact is mentioned also in #229 and #293.

Here's the code:

local https = assert(
            require("ssl.https"), 'LuaSocket: LuaSec not found')

Unless I'm missing something, require will throw an error if not called inside pcall:

$ lua
Lua 5.3.6  Copyright (C) 1994-2020 Lua.org, PUC-Rio
> assert(require("notthere"), "lib is not there")
stdin:1: module 'notthere' not found:
	no field package.preload['notthere']
	no file '/opt/local/share/lua/5.3/notthere.lua'
	no file '/opt/local/share/lua/5.3/notthere/init.lua'
	no file '/opt/local/lib/lua/5.3/notthere.lua'
	no file '/opt/local/lib/lua/5.3/notthere/init.lua'
	no file './notthere.lua'
	no file './notthere/init.lua'
	no file '/opt/local/lib/lua/5.3/notthere.so'
	no file '/opt/local/lib/lua/5.3/loadall.so'
	no file './notthere.so'
stack traceback:
	[C]: in function 'require'
	stdin:1: in main chunk
	[C]: in ?
> assert(pcall(require, "notthere"), "lib is not there")
stdin:1: lib is not there
stack traceback:
	[C]: in function 'assert'
	stdin:1: in main chunk
	[C]: in ?

Perhaps it'd work if require was wrapped in a pcall, but seems like there are some subtleties to work around in Lua 5.2. Would be great if somebody fixed it, since the current error is extremely confusing to newbies like me.
Using xpcall also sounds like a good idea, but as I said, I'm not that confident with Lua to write a patch that'd work across versions :(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

1 participant