Lua как запросить файл с удаленного http - PullRequest
1 голос
/ 22 сентября 2019

Я хочу получить доступ к файлу по протоколу http, а затем получить доступ к функциям, как будто мне «требуется» локальный файл.

local file_url = "http://127.0.0.1:800/myfile.lua"

local http = require("socket.http")
local remote = http.request(file_url) 
require "remote"

Как мне это сделать

1 Ответ

3 голосов
/ 23 сентября 2019

Фактический акт загрузки пакетов в require выполняется серией функций , хранящихся в таблице package.searchers (на языке Lua 5.2+. 5.1 использует package.loaders, но это та же идея).Все, что вам нужно сделать, это добавить функцию поиска, которая может обрабатывать «пакеты», чьи имена являются URL-адресами:

local http = require("socket.http")

local function http_loader(module_uri)

    --I don't know what this function does, so I assume it returns the actual text of the file.
    --If not, feel free to insert whatever the `socket` module needs to retrieve the text at the URI.
    local module_text = http.request(module_uri) 

    --Always do error checking.
    if --[[did the request succeed?]] then
        return loadstring(module_text)
    else
        return "could not find HTTP module name " .. module_uri
    end
end

table.insert(package.searchers, http_loader)

При этом вы должны иметь возможность непосредственно выполнять require "http://127.0.0.1:800/myfile.lua".

Если вместо этого у вас есть определенные модули в сети, которые вы хотите предварительно загрузить, вы можете использовать таблицу packages.preload .Например, если вы хотите предварительно загрузить файл Lua в http://127.0.0.1:800/myfile.lua, используя имя модуля «remote», вы можете сделать это:

local http = require("socket.http")

local function http_preload(module_uri, module_name)
    local module_text = http.request(module_uri) --Again, assuming this is the text.

    --Always do error checking.
    if --[[did the request succeed?]] then
        package.preload[module_name] = loadstring(module_text)
        return true
    else
        return nil, "could not find HTTP module name " .. module_uri
    end
end

assert(http_preload("http://127.0.0.1:800/myfile.lua", "remote"))

require "remote" --Includes the loaded file.

Теперь, ни один из этих методов волшебным образом не разрешит любые модули из myfile.lua для доступа к сетевым ресурсам.Если вы используете первый метод, а для myfile.lua требуются некоторые локальные ресурсы (например, на сервере), то он должен будет обращаться к ним через HTTP, как если бы он был на клиенте (потому что он был загружен с него).).

Если вы используете второй метод, вам потребуется http_preload модулей в таком порядке, чтобы ни один модуль не пытался загрузить ресурс, который еще не был предварительно загружен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...