LINUX.ORG.RU

Самый быстрый миниатюрный веб-сервер, написанный на Lisp'е

 , ,


0

1

Джон Фремлин создал миниатюрный веб-сервер для динамического контента, написанный на Lisp. Результаты тестирования, проведенного автором, были представлены на встрече Tokyo LUG, в соответствии с которыми, производительность и масштабируемость данного веб-сервера оставила позади связку lighttpd+fcgi+php и даже веб-сервер Mongrel, написанный на Ruby.

Что примечательно, сам динамический контент для этого веб-сервера требуется тоже писать на Лиспе. В качестве работоспособного примера был создан персональный блог автора, код которого занимает целых 102 строчки и поддерживает обновление новых записей через AJAX. Этот блог в качестве проверки на прочность уже смог выдержать Slashdot-эффект.

Блог автора

Результаты тестирования

>>> Подробности



Проверено: hibou ()

Ответ на: комментарий от Bohtvaroh

Так вот же он! (http://www.rsdn.ru/forum/src/322274.1.aspx)
---
using System;
using System.Text;
using System.IO;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace HTTPServer
{
    public class Interaction
    {
        const string Server_Directory = "C:\\Work\\HTTPServer\\page_content\\";
        const string Error_Message = "None";
        const string Main_Page = "nsu.htm";

        TcpClient Client;
        Hashtable Contents = new Hashtable();
        /// <summary>
        /// По строке запроса вычисляем путь к файлу.
        /// </summary>
        public string GetPath(string request)
        {
            int space1 = request.IndexOf(" ");
            int space2 = request.IndexOf(" ", space1 + 1);
            string url = request.Substring(space1 + 2, space2 - space1 - 2);
            if(url == "")
                url = Main_Page;
            return Server_Directory + url;
        }
        /// <summary>
        /// По файлу вычисляем тип содержимого в нём
        /// </summary>
        public string GetContent(string file_path)
        {
            string ext = "";
            int dot = file_path.LastIndexOf(".");
            if(dot >= 0)
                ext = file_path.Substring(dot, file_path.Length - dot).ToUpper();
            if(Contents[ext] == null)
                return "application/" + ext;
            else
                return (string)Contents[ext];
        }
        /// <summary>
        /// Отправляем заголовок клиенту.
        /// </summary>
        public void WriteHeaderToClient(string content_type, long length)
        {
            string str = "HTTP/1.1 200 OK\nContent-type: " + content_type 
                   + "\nContent-Encoding: 8bit\nContent-Length:" + length.ToString() 
                   + "\n\n";
            Client.GetStream().Write(Encoding.ASCII.GetBytes(str), 0, str.Length);
        }
        /// <summary>
        ///  Отвечаем на запрос клиенту
        /// </summary>
        public void WriteToClient(string request)
        {
            string file_path = GetPath(request);
            if(file_path.IndexOf("..") >= 0 || !File.Exists(file_path) ) 
            {
                WriteHeaderToClient("text/plain", Error_Message.Length);
                Client.GetStream().Write(Encoding.ASCII.GetBytes(Error_Message), 0, Error_Message.Length);
                return;
            }
            FileStream file = File.Open(file_path, FileMode.Open);
            WriteHeaderToClient(GetContent(file_path), file.Length);
            byte[] buf=new byte[1024];
            int    len;
            while((len = file.Read(buf,0,1024)) != 0)
                Client.GetStream().Write(buf, 0, len);
            file.Close();
        }
        public void Interact()
        {
            try
            {
                byte[] buffer = new byte[1024];
                string request = "";
                while(true)
                {    
                    int count = Client.GetStream().Read(buffer, 0, 1024);
                    request += Encoding.ASCII.GetString(buffer, 0, count);
                    if(request.IndexOf("\r\n\r\n") >= 0) // Запрос обрывается \r\n\r\n последовательностью
                    {
                        WriteToClient(request);
                        request = "";
                    }
                }
            }
            catch(Exception) 
            {
            }
        }
        protected void SetContents()
        {
            Contents.Add("", "application/unknown");
            Contents.Add(".HTML", "text/html");
            Contents.Add(".HTM", "text/html");
            Contents.Add(".TXT", "text/plain");
            Contents.Add(".GIF", "image/gif");
            Contents.Add(".JPG", "image/jpeg");
        }
        public Interaction(TcpClient client)
        {
            Client = client;
            SetContents();
            Thread interact = new Thread(new ThreadStart(Interact));
            interact.Start();
        }
    }

    public class Server
    {
        private TcpListener Listener;

        public Server(int port)
        {
            Listener = new TcpListener(port);
            Listener.Start();
            Listen();
        }
        ~Server()
        {
            if (Listener!= null)
                Listener.Stop();
        }
        /// <summary>
        /// Ждём подключений к нашему серверу и обрабатываем их
        /// </summary>
        public void Listen()
        {
            while(true)
                new Interaction(Listener.AcceptTcpClient());
        }
        [STAThread]
        static void Main(string[] args)
        {
            Server server = new Server(8123);
        }
    }
}

Коротко и ясно! :)

impfp
()

Ну вы и засрали его блог!..

ps maxcom! Включай анонимуса и отключай регистрантов!

impfp
()

> Этот блог в качестве проверки на прочность уже смог выдержать Slashdot-эффект.

Вот бред-то. Ходил на него по ссылке с толксов -- лежал (как и у других читавших).

www_linux_org_ru ★★★★★
()

LOR-эффект ему выдержать явно не удалось...

Git
()

я вот что думаю. ЛОР'у давно пора открыть свой сервис - проверка сайтов на отказоустойчивость =) Типо за определенную мзду ссылка вешается на главную, потом идет проверка. ЛОР эффект непобедим.

rave
()
Ответ на: комментарий от funky_dennis

>Написать то можно на асме, но это будет user space, а kernel space с его read/write/kqueue/epoll/gettimeofday/accept/close никто не отменял

Точно. Заходим в исходники mplayer, потом пишем гневное письмо его разработчикам.

jackill ★★★★★
()

сдаётся мне, что в этом изделии скобочек больше, чем всех остальных букв вместе взятых

swar0g ★★★★
()
Ответ на: комментарий от jackill

Вот как раз в mplayer'е ассемблерные вставки оправданы, так как mplayer не застревает в ведре.

funky_dennis
()
Ответ на: комментарий от rave

Зачем его открывать-то? Уже давно такой сервис работает!

xMad
()

> Джон Фремлин создал миниатюрный веб-сервер... оставил позади связку lighttpd+fcgi+php и даже веб-сервер Mongrel, написанный на Ruby. Что примечательно, сам динамический контент для этого веб-сервера требуется тоже писать на Лиспе. В качестве работоспособного примера был создан персональный блог автора

Умелец Павсикакий Ногозадерищенский из Усть-Мухобойска создал миниатюрный автомобиль, который оставил далеко позади асфальтоукладчик "Ивановец" и почти догнал трактор "Беларусь". Что примечательно, творение умельца-левши может двигаться только по абсолютно гладкой горизонтальной поверхности. В качестве демонстрации работоспособности изобретения Павсикакий успешно доставил кадку водки соседу Михалычу.

Kuka ★★
()

Цитата с блога: "Я ЖОПА!! АГАГАГАГАГА!!))))"

А раньше "Здесь был Вася" писали... Эх, молодёжь!
:)

matumba ★★★★★
()
Ответ на: комментарий от swar0g

> сдаётся мне, что в этом изделии скобочек больше, чем всех остальных букв вместе взятых

А на HTML/LaTeX/RTF и дизайнят ради рукописного гемороя - люди не ищут простых, визуальных путей! :) Лисп - ничуть не хуже/лучше вышеупомянутых.

Юмор понравился. :)

matumba ★★★★★
()
Ответ на: комментарий от Kuka

>Что примечательно, творение умельца-левши может двигаться только по абсолютно гладкой горизонтальной поверхности.

>В качестве демонстрации работоспособности изобретения Павсикакий успешно доставил кадку водки соседу Михалычу.

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

AVL2 ★★★★★
()

цитата с блога: Здравствуйте linux.org.ru!, Thanks for your light-hearted take on things., Anybody up for writing some docs/howtos in Russian? Just email me., Posted 2009-05-28 05:56:17 GMT by John Fremlin

;)

IxIKobrAIxI
()

Мда, засрали человеку блог... Вообще, я бы на его месте не реализовывал возможность комментировать и тогда вышло бы меньше 100 строчек :)

SatiriK
()
Ответ на: комментарий от SatiriK

> Мда, засрали человеку блог...

помоему создателю блога совершенно наплевать на наши комментарии

xMad
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.