Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Скрипты для RusHub'а _ WebServer

Автор: Nickolya 23.1.2010, 16:23

WebServer
Версия: 0.2
Совместим с последними версиями хаба!

Скрипт создания веб-интерфейса для хаба. Для работы нужна библиотека сокетов, качать ее http://mydc.ru/topic2951.html, и библиотека extend.dll (заимствовано из LuaAIO), она находится в прикрепленном архиве, все библиотеки кладем в папку libs.
Скрипт по умолчанию работает на 81 порту, и пароль и логин по умолчанию admin, меняется это все в начале самого скрипта.

Изменения в версии 0.2 по отношению к 0.1:



Выкладываю версию в таком виде для того чтобы оттестировали и посмотрели, а так же чтобы Jaska перевел под работу с веб-интерфейсом самого русхаба ввиду отсутствия времени у меня.

Мануал по работе страниц скрипта для разработчиков:

Код луа заключается в теги аналогично пхп:
Код
<?lua -- код ?>что-то там
В самом же парсере все подобные конструкции приводятся к виду
Код
-- код
print([=============[что-то там]=============])
Подобные скобки нужны чтобы исключить вложенные строки из оформления или еще чего-то, над этим моментом надо еще поработать big_smile.gif
Для перенаправления используется код вида
Код
<?lua
    MOVETO = (SERVER.tHeaders["Host"] or "").."/config/"
    return
?>

после определения переменной MOVETO все то что сгенерирует код скрипта не будет использовано и будет совершено перенаправление посредством отсылки нужных заголовков клиенту, чтобы не выполнять лиший код после определения страницы перенаправляения мы делаем возврат (return) из глобального окружения.

Для работы с сессиями определена таблица SESSION в которую можно заносить (и удалять) данные в любом виде, идентификатор сессии хранится в куки и срок сессии определяется в конфигурации скрипта параметрами
Код
iSessionTime = 60 * 60 * 10
iFirstSessionTime = 60 * 2
где iFirstSessionTime - время на существовании сессии если пользователь зашел в первый раз и не предпринимает никаких действий, а iSessionTime - время для сессии для 2х и более переходов пользователя по страницам сайта.

Так же скрипт получает таблицу SERVER, являющуюся таблицей клиента, обработанного до этого движком скрипта. Эта таблица имеет вид:
Код
SERVER = {
    ["iStartTime"] = 4,968,
    ["sUrl"] = "/config/",
    ["sGetData"] = "we=get&page=1234",
    ["sFile"] = "one.lua",
    ["tPostData"] = {
        ["one"] = "1",
    },
    ["tHeaders"] = {
        ["Accept-Charset"] = "iso-8859-1, utf-8, utf-16, *;q=0.1",
        ["TE"] = "deflate, gzip, chunked, identity, trailers",
        ["Accept-Encoding"] = "deflate, gzip, x-gzip, identity, *;q=0",
        ["Accept-Language"] = "ru-RU,ru;q=0.9,en;q=0.8",
        ["Host"] = "localhost:81",
        ["Connection"] = "Keep-Alive, TE",
        ["Accept"] = "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
        ["User-Agent"] = "Opera/9.80 (Windows NT 5.1; U; MRA 5.4 (build 02620); ru) Presto/2.2.15 Version/10.10",
        ["Cookie"] = "LUASESSID=93C975EDB2DB840152F7106892A7509C84EBFE8273D3CDF964D061A0E49BDB73; pid=431697804b79522a12991ac0677f2d2d; LUASESSID=93C975EDB2DB840152F7106892A7509C84EBFE8273D3CDF964D061A0E49BDB73",
        ["Referer"] = "http://localhost:81/config/",
        ["Cookie2"] = "$Version=1",
    },
    ["tCookie"] = {
        ["pid"] = "431697804b79522a12991ac0677f2d2d",
        ["LUASESSID"] = "93C975EDB2DB840152F7106892A7509C84EBFE8273D3CDF964D061A0E49BDB73",
    },
    ["sVersion"] = "HTTP/1.1",
    ["sLoadFileWay"] = "C:/Server/RusHub/scripts/www/config/index.lua",
    ["sPath"] = "/config/",
    ["Client"] = tcp{client}: 00BFC0F0,
    ["tGetData"] = {
        ["we"] = "get",
        ["page"] = "1234",
    },
    ["sMethod"] = "GET",
}

Для удобства таблицы SERVER.tGetData и SERVER.tPostData вынесены в отдельные таблицы (ссылкой) GET и POST соответственно.
Так же таблица Core доступна напрямую из окружения.

В сам скрипт глобальное окружение (таблицы table, math и прочие) передаются через ссылку в переменной _G (аналогично модулю).
Для опять же удобства работы со строками таблица string внесена в окружение выполняемого скрипта и работать со строками можно по-прежнему, к примеру:
Код
one = ("one two"):match"%S-"
остальные функции надо вызывать через _G, к прмеру так:
Код
sData = _G.table.concat(tOurData)


В глобальном окружении так же существуют функция print, осуществляющая добавление данных ко всему выводимому содержимому. Обычная функция луа по-прежнему доступна через _G.print

Плюсом парсер обрабатывает функцию loadtoscriptfile в которую передается путь к загружаемому коду или тексту в файл, обработка идет аналогично loadfile, однако хочу заметить что эта функция обрабатывается на уровне парсинга страницы при ее преобразовании в код луа и в самом окружении она не присутствет. Вот пример, путь мы даем относительно ТЕКУЩЕГО загруженного скрипта:
Код
loadtoscriptfile("../sources/Login.lua")


По любым вопросам и замечаниям работы парсера обращаться в тему скрипта! big_smile.gif


Скрипт создан на основе сделанного как-то давно мною скрипта http://mydc.ru/topic289.html для PtokaX.

Старые версии, оставил на память, качать их не надо
 WebServer_v0.1.rar ( 7.41 килобайт ) : 27


 extend.rar ( 16.73 килобайт ) : 126
 WebServer_v0.2.rar ( 10.02 килобайт ) : 106
 

Автор: Otshelnik-Fm 24.1.2010, 15:03

Цитата
[14:47:48] *** Произошла ошибка в скрипте: C:/rushub_2.0.9a/scripts/WebServer_v0.1.lua:444: bad argument #1 to 'pairs' (table expected, got nil)


И расскажи что нужно вписать (или для чего они) вот сюда:

iTimeout = 1/20
sAddress = "*" - для теста писать локалхост?
iPort = 81 - это ясно - порт подключения
iConnections = 32
iTimerInterval = 300
iSessionTime = 60 * 20
iUidLen = 32

Цитата
[15:00:14] <смусмумрик> Произошла ошибка в скрипте: C:/rushub_2.0.9a/scripts/WebServer_v0.1.lua:116: module 'mime' not found:
no field package.preload['mime']
no file 'C:\rushub_2.0.9a\mime.lua'
no file 'C:\rushub_2.0.9a\libs\mime.lua'
no file 'C:\rushub_2.0.9a\scripts\mime.lua'
no file 'C:\rushub_2.0.9a\scripts\libs\mime.lua'
no file 'C:\rushub_2.0.9a\plugins\mime.lua'
no file 'C:\rushub_2.0.9a\mime\init.lua'
no file 'C:\rushub_2.0.9a\libs\mime\init.lua'
no file 'C:\rushub_2.0.9a\scripts\mime\init.lua'
no file 'C:\rushub_2.0.9a\scripts\libs\mime\init.lua'
no file 'C:\rushub_2.0.9a\plugins\mime\init.lua'
no file 'C:\rushub_2.0.9a\mime.dll'
no file 'C:\rushub_2.0.9a\libs\mime.dll'
no file 'C:\rushub_2.0.9a\scripts\mime.dll'
no file 'C:\rushub_2.0.9a\scripts\libs\mime.dll'
no file 'C:\rushub_2.0.9a\plugins\mime.dll'
- [14:47:02] *** Произошла ошибка в скрипте: C


А вот это сообщение вылезло простому юзеру тоже (а должно по идее админу тока) когда я не докинул в папку module 'mime'

Автор: Setuper 24.1.2010, 15:07

В коде скрипта так:

Код
function OnError(sErrorMsg)
    Core.SendToAll("*** Произошла ошибка в скрипте: "..sErrorMsg)
    return true
end

поэтому сообщение об ошибке отправляется всем. Чтобы отправлялось только админу нужно исправить:
Код
function OnError(sErrorMsg)
    Core.SendToProfile(0, "*** Произошла ошибка в скрипте: "..sErrorMsg)
    return true
end
(при условии, что профиль 0 - это профиль админа big_smile.gif )

Автор: Nickolya 24.1.2010, 15:15

Ошибок больше никаких не было? Скорее всего скрипт надо просто перезапустить т.к. функция остановила выполнение при ошибке, это результат того что в OnError возвращается true. Попробуй запустить заново со всеми библиотеками и прочим, будет ли эта ошибка?!

А настройки имеют следующие значения:
iTimeout = 1/20 - таймаут на операции с сокетами, если выдается ошибка при подключении к сайту, лучше это значение увеличить
sAddress = "*" - * означает все сетевые интерфейсы, локалхост сделает "сайт" доступным только для локального подключения, лучше это не трогать
iPort = 81 - да, это действительно порт подключения
iConnections = 32 - максимальное количество одновременных соединений
iTimerInterval = 300 - интервал проверки новых соединений и их обработки
iSessionTime = 60 * 20 - время сессии, когда оно закончится, сессия удаляется и надо вновь войти
iUidLen = 32 - длина идентификатора сессии

Автор: Otshelnik-Fm 24.1.2010, 15:25

нет больше такой оошибки. При попытке войти на сайт по адресу http://mydc.ru/r/?http://localhost:81/

Цитата
Ошибки: У пользователя Otshelnik-Fм нет прав доступа!

Автор: Setuper 24.1.2010, 15:30

Первые шаги по написанию веб-морды.
Помнится кто-то говорил, что lua сокеты глючат (не знаю не проверял). Однако, возможно стоит задуматься о рациональности работы веб-сервера на lua? С одной стороны, действительно хорошо, не нужно устанавливать какой-нибудь там апач, php и тд, с другой стороны, стационарный веб сервер наверное всё же будет работать быстрее. Поэтому возникает сразу 3 мысли (которые в принципе все возможно реализовать со временем). Первая, - это данный веб-сервер на lua. Вторая, - это написание под хаб плагина веб сервера. Третья, - это установка обычного веб сервера (того же апача). При реализации всех этих вещей админ хаба сможет сам выбрать.

Но это так, на будущее big_smile.gif А пока думаю нужно ещё много сделать в этом направлении.

Otshelnik-Fm:

Код
sAccessNick = "admin"
sAccessPass = "admin"

Автор: Otshelnik-Fm 24.1.2010, 15:41

туплю что-то... Спасибо. Работает идеально всё!

Автор: Nickolya 24.1.2010, 16:01

Цитата(Nickolya @ 23.1.2010, 16:23) *
Скрипт по умолчанию работает на 81 порту, и пароль и логин по умолчанию admin, меняется это все в начале самого скрипта.

Otshelnik-Fm, читаем 1 пост внимательнее...

Цитата(Setuper @ 24.1.2010, 15:30) *
Первые шаги по написанию веб-морды.
Помнится кто-то говорил, что lua сокеты глючат (не знаю не проверял). Однако, возможно стоит задуматься о рациональности работы веб-сервера на lua? С одной стороны, действительно хорошо, не нужно устанавливать какой-нибудь там апач, php и тд, с другой стороны, стационарный веб сервер наверное всё же будет работать быстрее. Поэтому возникает сразу 3 мысли (которые в принципе все возможно реализовать со временем). Первая, - это данный веб-сервер на lua. Вторая, - это написание под хаб плагина веб сервера. Третья, - это установка обычного веб сервера (того же апача). При реализации всех этих вещей админ хаба сможет сам выбрать.

Но это так, на будущее big_smile.gif А пока думаю нужно ещё много сделать в этом направлении.

Setuper, сокеты вполне себе работают, спасибо за библиотеку под русхаб.
Для себя делал тест вот этого сервера, открывал в опере 20 закладок и ставил ежесекундное обновление, время работы самого скрипта не превышало и сотой доли секунды, а максимальное время ожидания клиента составляло сотые доли секунды, хотя обработка и стоит в 300 мсек. Я так думаю что апаче даже тяжелее big_smile.gif Хотя возможности сравнивать конечно бессмысленно. Единственное, до какого извращения я еще не дошел так это обработка конструкций вида
Код
<?lua if sData ?>какие-то данные<?lua else ?>еще что-то<?lua end ?>
но думаю и это сделаю big_smile.gif Я хочу добиться того чтобы юзер воткнул библиотеки если надо и включил скрипт с минимальными настройками, без установки дополнительных программ и извращения с ними. Прямое взаимодействие с хабом дает нам прекрасную и простую возможность напрямую им управлять.
Я очень бы хотел сервер, написанный не на скриптовом языке и обрабатывающий луа т.к. все-таки это самый быстрый скриптовый язык, а расширить возможности можно применяя апи... Если будет плагин, из него потом можно и отдельный веб-сервер сделать, то это будет прекрасно, еще одно великолепное творение big_smile.gif

Автор: Setuper 20.2.2010, 16:20

Дела обстоят так...

Взвесив все за и против, решил написать веб сервер в дополнении к уже имеющемуся dc серверу (встроить веб сервер). Точнее вот как:
На хабе существует обычный сервер, который принимает соединения. Этот сервер наследуется dc сервером.
Так вот... Можно точно также сделать надстройку веб сервера. При этом все соединения, будь они dc соединениями или соединениями веб сервера, будут обрабатываться одним единым сервером, а после обработки парситься уже своими серверами. Данная система "многосерверности" была заложена изначально, и является гениальным конструктивным решением. Общая обработка и, разные парсеры и дальнейшее поведение.

При всём сказанном пока имеем вот что: прослушиваем порт 411 для dc сервера и, например, порт 8080 для веб-сервера.
При коннекте на порт веб сервера, начинаем получать данные от клиента. После получения данных в lua вызывается событие, которое будет отвечать за полученные данные. Из функции этого события можно будет с помощью api функции отправить клиенту ответ, при этом сервер будет держать некоторое время соединение.

Теперь встаёт вопрос. Как работают веб серверы? Ведь они закрывают иногда соединения. Когда они его закрывают? Ведь в случае частых обменов данными между клиентом и сервером (например, онлайн веб-чат), не логично рвать соединение. Хотя разорвать соединение - это обычная практика для веб-серверов, так как в любом случае существуют куки, которые отвечают за состояние и стадии клиента. Поэтому возможен случай разрыва соединения после определённого интервала времени бездействия.

Теперь, почему нельзя сделать так: принять соединение клиента, получить данные от клиента, отправить ответ клиенту и разорвать соединение? Так нельзя сделать по причине существования на сервере неблокирующих сокетов, из-за того, что за один раз данные сервер может получить от клиента не все, а только часть. Отсюда возникает ещё один вопрос: какой разделитель команд в протоколе http ?
Для NMDC протокола всё прозрачно: получаем данные из неблокирующего сокета и записываем их в буфер до тех пор, пока не встретим разделитель протокола (а именно знак |). После того, как встретили разделитель протокола, извлекаем из буфера команду до этого разделителя и отсылаем это команду парсеру на обработку. В http протоколе не понятно когда обрабатывать и вызывать lua событие, ведь для вызова lua события нужно получить все данные, ну или хотя бы 1 команду, а из-за неблокирующих сокетов за 1 раз мы не можем гарантировать что получим все данные от клиента, поэтому не можем вызывать lua событие.

Вот такие трудности по написанию веб-сервера, которые я надеюсь вы мне поможете решить big_smile.gif

Автор: Nickolya 21.2.2010, 12:49

Замечательно! Конечно поможем, благодаря тому творению что ты видишь выше, я немного изучил работу веб-сервера. Рассказываю.
Неразрываемое соединение в принципе, как мне кажется, немного ускоряет работу клиента т.к. он прогоняет несколько запросов через 1 поток соединения, но повышается нагрузка на сам сервер т.к. ему приходится держать соединение пользователя. Так что для начала не советую заморачиваться и сделать закрывающий после каждого запроса соединение сервер. Это осуществляется отсылкой заголовка

Цитата
Connection: close
и закрытем соединение сразу после передачи всех данных. Потом если будет желание доработаешь сервер со всяким изюмом big_smile.gif
По поводу определения команд протокола не стоит особо заморачиваться. В самом начале клиент посылает запрос состоящий из заголовков + еще может быть дополнительное тело сообщения, в котором передаются POST данные. Все заголовки начинаются с новой строки с переносом \r\n к примеру (http://mydc.ru/r/?http://ru.wikipedia.org/wiki/HTTP, про все остальное читать там):
Код
GET / HTTP/1.1
Host: www.example.com
User-Agent: MyLonelyBrowser/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
И по-идее запрос заканчивается пустой строкой, по которой можно судить об окончании запроса. Конечно для защиты надо сделать определенное ограничение для получения заголовков. При наличии POST-данных, мы получаем от клиента ровно столько байт, сколько указано в заголовке
Цитата
Content-Length: 1024
это число конечно тоже надо ограничивать дабы избежать перегрузок сервера, POST-данные идут через пустую строку от заголовков (http://mydc.ru/r/?http://www.codenet.ru/webmast/php/HTTP-POST.php):
Цитата
POST http://mydc.ru/r/?http://www.site.ru/news.html HTTP/1.0\r\n
Host: www.site.ru\r\n
Referer: http://mydc.ru/r/?http://www.site.ru/index.html?#092;r\n
Cookie: income=1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 35\r\n
\r\n
login=Petya%20Vasechkin&password=qq

Если что непонятно - спрашивай, буду очень сильно рад помочь. Спасибо за разработки!

Автор: Setuper 21.2.2010, 13:06

Вопрос вот какой: когда вызывать lua событие? Как определить полное получение всего того, что отправил клиент?
Из-за наличия неблокирующих сокетов, то что отправил клиент сервер может не получить за один раз.
Например, клиент отправляет запрос:

Код
GET / HTTP/1.1
Host: www.example.com
User-Agent: MyLonelyBrowser/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7

Сервер при первом прочтении из сокета получает:
Код
GET / HTTP/1.1
Host: www.example.com
User-Agent: MyLonelyBrowser/5.0
Accept: text/html,application/xht
при втором прочтении из сокета, получает вторую часть:
Код
ml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7


По своей сути lua событие для обработки запроса нужно вызывать после получения полностью того, что хотел отправить клиент, а не после каждого получения какой-то неполной части.

Конечно, при таком малом запросе скорее всего сервер получит всё за один раз, а не за два, однако, при большой нагрузки сервер попытается распределить получение на несколько раз, дабы отдать время на выполнение других задач. То есть не блокирующие сокеты - это своего рода распределение нагрузки, подобно многопоточности.

С другой стороны можно вызывать lua событие при получении той или иной строки. То есть как и в NMDC протоколе, ждать разделитель (в данном случае знак переноса каретки и строки) и вызывать lua событие для обработки команды, которая идёт вплоть до разделителя. В этом случае последовательность команд http протокола должна контролироваться в самом lua.

Автор: Nickolya 21.2.2010, 13:13

Цитата(Nickolya @ 21.2.2010, 12:49) *
И по-идее запрос заканчивается пустой строкой, по которой можно судить об окончании запроса.

Попробуй этот метод, я думаю так все и происходит. Т.е. фактически запрос полностью вот такой:
Цитата
GET / HTTP/1.1\r\n
Host: www.example.com\r\n
User-Agent: MyLonelyBrowser/5.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n
(пустая строка)

Луа событие конечно лучше всего по окончанию всего запроса.

Автор: Setuper 21.2.2010, 13:50

Пустая строка - это \r\n
То есть по своей сути нужно ловить \r\n\r\n. Предыдущий перенос и перенос текущей пустой строки.
Сейчас проверю действительно ли это так

Да, действительно, клиент в конце своего запроса ставит пустую строку.
Разделитель определён. Осталось реализовать big_smile.gif

Автор: Setuper 2.3.2010, 13:35

Очень нужна реализация конструкции вида:

Код
<?lua if sData ?>какие-то данные<?lua else ?>еще что-то<?lua end ?>

big_smile.gif
По всей видимости нужна обработка не каждой части <?lua ?>, а полностью всех частей с соответствующими функциями, отвечающими за вставки данных между этими частями.

Так же внутри данной конструкции нужно предусмотреть Lua-функцию echo(), которая добавляла бы данные.

Код
<?lua echo("msg") ?>

Автор: Nickolya 2.3.2010, 15:31

Выложил в 1 пост "новую" версию, постарался все по-быстрому описать, если что непонятно будет - спрашивайте.

Автор: Setuper 2.3.2010, 18:46

Огромное спасибо за новую версию. Отличная работа! Даже ошибки при парсинге показываются big_smile.gif Класс.

Автор: Setuper 4.3.2010, 22:42

Как получить имя сессии?
Переменная SESSION = tSessions[sUid].sData, являющаяся таблицей - пустая. Нужен аналог php функции session_name()
big_smile.gif

И ещё нужен аналог функции getmypid().

Автор: Nickolya 5.3.2010, 0:26

Пока сделано так что сессии не контролируются скриптом веб-сервера, сам сервер с ними работает, так что никаких функций для этого нет. А эта таблица, что передается по сслыке (я о SESSION) является как раз той в которой можно что-то сохранять и при следующем вызове скрипта таблица будет уже не пустой.

А фунция getmypid "получает ID РНР-процесса", объясни пожалуйста доходчиво зачем оно надо? Процесса, ввиду отсутствия функции апи что запускает функцию луа в отдельном потоке, как такового и нет, он всегда один... Или я что-то не так понял?

Замеченые баги сейчас: идентификатор сессии при ее истечении меняется на новый только после перегрузки страницы, т.е. приходится лишний раз выполнить какое-то дейстиве чтобы в куки записался новый идентификатор, работа с сессиями была введена эксперементально, будем доводить до ума...
И еще функция loadtoscriptfile не принимает динамические переменные созданные в ходе работы скрипта ввиду того что функция обрабатывается на уровне парсинга страницы, попробую это поправить в новой версии парсера.

Остальные пожелания к парсингу и самой работе луа для веба выслушаю с большим удовольствием в этой теме big_smile.gif

Автор: Setuper 5.3.2010, 0:36

Функция getmypid нужна для создания уникального идентификатора для аякса. Однако, думаю что и без него можно будет уникальность организовать.

Автор: Nickolya 5.3.2010, 0:45

Как еще 1 параметр юзера можно завести счетчик и банально его увеличивать на 1 с каждым новым запросом, так подойдет? Сделаешь сам еще 1 параметр сохраняющийся в талицу при запросе?

Автор: Setuper 5.3.2010, 23:52

Нужна функция отсылки заголовка. Аналог php функции header, так как я, например, хочу в заголовке отправить: "Content-Type: text/plain; charset=windows-1251"

И ещё нужно добавить очень важный тип отправки файлов: js

Автор: Nickolya 6.3.2010, 15:10

Пока заголовки берутся из подборок, к примеру:

Код
tServerInfo[1] = new..    -- usual
    tServerData.Server..new..
    tServerData.ContentType..new..
    tServerData.Expires..new..
    tServerData.CacheControl..new..
    tServerData.Pragma..new..
    tServerData.Connection..new..
    new
если хочешь - сделай свою, с функцией учту.

Автор: Setuper 8.3.2010, 16:35

Разбор полётов.

Сравнение полей PHP переменной $_SERVER с полями Lua таблицы SERVER.
Обозначение соответствия: php <=> lua

Заголовки:

Код
$_SERVER["HTTP_ACCEPT"] <=> SERVER["tHeaders"]["Accept"]
$_SERVER["HTTP_ACCEPT_LANGUAGE"] <=> SERVER["tHeaders"]["Accept-Language"]
$_SERVER["HTTP_ACCEPT_ENCODING"] <=> SERVER["tHeaders"]["Accept-Encoding"]
$_SERVER["HTTP_ACCEPT_CHARSET"] <=> SERVER["tHeaders"]["Accept-Charset"]
$_SERVER["HTTP_HOST"] <=> SERVER["tHeaders"]["Host"]
$_SERVER["HTTP_USER_AGENT"] <=> SERVER["tHeaders"]["User-Agent"]
$_SERVER["HTTP_CONNECTION"] <=> SERVER["tHeaders"]["Connection"]
$_SERVER["HTTP_KEEP_ALIVE"] <=> SERVER["tHeaders"]["Keep-Alive"]
$_SERVER["HTTP_COOKIE"] <=> SERVER["tHeaders"]["Cookie"]
$_SERVER["HTTP_REFERER"] <=> SERVER["tHeaders"]["Referer"]
$_SERVER["HTTP_TE"] <=> SERVER["tHeaders"]["TE"]
$_SERVER["HTTP_FROM"] <=> SERVER["tHeaders"]["From"]
$_SERVER["HTTP_EXPECT"] <=> SERVER["tHeaders"]["Expect"]
$_SERVER["HTTP_RANGE"] <=> SERVER["tHeaders"]["Range"]
$_SERVER["HTTP_AUTHORIZATION"] <=> SERVER["tHeaders"]["Authorization"]
$_SERVER["HTTP_IF_MATCH"] <=> SERVER["tHeaders"]["If-Match"]
$_SERVER["HTTP_IF_MODIFIED_SINCE"] <=> SERVER["tHeaders"]["If-Modified-Since"]
$_SERVER["HTTP_IF_MODIFIED_SINCE"] <=> SERVER["tHeaders"]["If-None-Match"]
$_SERVER["HTTP_IF_RANGE"] <=> SERVER["tHeaders"]["If-Range"]
$_SERVER["HTTP_IF_UNMODIFIED_SINCE"] <=> SERVER["tHeaders"]["If-Unmodified-Since"]
$_SERVER["HTTP_MAX_FORWARDS"] <=> SERVER["tHeaders"]["Max-Forwards"]
$_SERVER["HTTP_X_FORWARDED_FOR"] <=> SERVER["tHeaders"]["X-Forwarded-For"]
$_SERVER["HTTP_PROXY_AUTHORIZATION"] <=> SERVER["tHeaders"]["Proxy-Authorization"]
$_SERVER["CONTENT_LENGTH"] <=> SERVER["tHeaders"]["Content-Length"]
$_SERVER["CONTENT_TYPE"] <=> SERVER["tHeaders"]["Content-Type"]


Переменные сервера:

Код
$_SERVER["GATEWAY_INTERFACE"] <=> ?
$_SERVER["PATH_INFO"] <=> ?
$_SERVER["PATH_TRANSLATED"] <=> ?
$_SERVER["REMOTE_ADDR"] <=> ?
$_SERVER["REMOTE_HOST"] <=> ?
$_SERVER["REMOTE_PORT"] <=> ?
$_SERVER["REMOTE_USER"] <=> ?
$_SERVER["SERVER_ADDR"] <=> ?
$_SERVER["SERVER_NAME"] <=> ?
$_SERVER["SERVER_PORT"] <=> ?
$_SERVER["SERVER_SOFTWARE"] <=> ?
$_SERVER["SCRIPT_FILENAME"] <=> SERVER["sLoadFileWay"]
$_SERVER["SERVER_PROTOCOL"] <=> SERVER["sVersion"]
$_SERVER["REQUEST_METHOD"] <=> SERVER["sMethod"]
$_SERVER["QUERY_STRING"] <=> SERVER["sGetData"]
$_SERVER["REQUEST_URI"] <=> SERVER["sUrl"]
$_SERVER["SCRIPT_NAME"] <=> SERVER["sPath"]..SERVER["sFile"]
$_SERVER["REQUEST_TIME"] <=> _G.os.time()


Переменные сервера Apache:

Код
$_SERVER["DOCUMENT_ROOT"] <=> _G.Core.sScriptsPath.."www/"
$_SERVER["SERVER_ADMIN"] <=> ?
$_SERVER["SERVER_SIGNATURE"] <=> ?



Замечания:

PHP переменная $_SERVER["SCRIPT_NAME"] содержит информацию вместе взятых Lua переменных: SERVER["sPath"]..SERVER["sFile"]

PHP переменная $_SERVER["REQUEST_TIME"] отличается от lua переменной SERVER["iStartTime"] тем, что в отличии от последней возвращает os.time(), а не os.clock().

Автор: Setuper 9.3.2010, 20:36

Библиотека для аякса написана. Однако, при испытаниях с данным скриптом, клиент не может ничего отослать на сервер, так как соединение сервер не поддерживает.

Переписав немного данный скрипт под использование на встроенном в хаб веб-сервере, не разрывая соединение с клиентом, клиент при помощи библиотеки jquery отправляет запрос на сервер, однако от сервера получает в ответ lua файл с исполняемым кодом)))))))
Подозреваю что все дело в заголовке: "Content-Type: text/html;"
Поэтому для успешной работы аякса необходима функция установки полей заголовка (аналог php функции header).

строчка:

Код
if tClient.tHeaders["Content-Type"] == "application/x-www-form-urlencoded" then

не даёт получить POST данные.
Например, мой браузер отправляет в POST заголовке следующее:
Код
Content-Type: application/octet-stream;




Ух... Наконец-то реализовал на lua обмен данными по технологии аякс!!! big_smile.gif
С мозиллой и ie аякс пашет на отлично, даже без специального Content-Type. А вот для оперы нужна функция header (((

Автор: Jaska 9.3.2010, 21:30

Немного отойду от темы, однако будет полезно я думаю. http://mydc.ru/r/?http://json.luaforge.net/ реализована работа lua c http://mydc.ru/r/?http://www.json.org/json-ru.html big_smile.gif

Насчет post заголовка, вычитал

Цитата
A MIME attachment with the content type "application/octet-stream" is a binary file.

Поискав еще нашел
Цитата
mime type: application/octet-stream - Исполняемый файл для DOS или Microsoft Windows (37*) (.com, .exe)

У меня подозрения что где-то ошибка. Этот тип не используется для обработки запросов, сервер николя сделал правильно, что отдал lua-файл с исполняемым кодом. (хотя по соображениям безопасности этого не должно происходить я думаю)

Автор: Setuper 9.3.2010, 21:56

По поводу отдачи файла исполняемым кодом, то это я немного наложал, когда переводил сервер под работу на встроенном веб-сервере.
Что касается json, то именно это я и реализовал, когда переписывал библиотеку JsHttpRequest с php на lua.

application/octet-stream веб-сервер должен хавать, поэтому его нельзя запрещать, в противном случае библиотека JsHttpRequest работать не будет!

Автор: Jaska 9.3.2010, 22:18

Понятно что должен хавать но должен хавать только определенные типы файлов а не отдавать исполняемый код

Автор: Setuper 9.3.2010, 22:31

Я же сказал, что отдача исполняемого кода - это была моя ошибка при переводе.

Автор: KCAHDEP 11.7.2012, 17:03

А планируется ли в будущем или может уже есть подобное vhcp?