eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingEmbedded HTTP Server › Re: Embedded HTTP Server
  • Data: 2020-06-06 21:00:05
    Temat: Re: Embedded HTTP Server
    Od: Maciej Sobczak <s...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]


    > Po pierwsze, to aż się prosi, żeby ten serwer był zwykłą klasą. Czemu ktoś nie
    miałby sobie stworzyć 5 serwisów WWW działających na różnych portach?

    No właśnie. I tu poruszamy ważną kwestię. Bo piszesz, że aż się prosi, ale potem
    okazuje się, że nikt nie prosi, tylko czemu ktoś by miał nie prosić.

    A mi chodziło o to, żeby pakiet 1.0 przekroczył próg używalności a nie o to, żeby
    rozwiązać problemy typu "czemy ktoś nie miałby".

    Natomiast, nic nie stoi na przeszkodzie, żeby sobie zawołać funkcję server_start() 5
    razy z różnymi portami, z 5 różnych wątków, bo ta funkcja i tak nie ma stanu
    globalnego. Nie trzeba mieć do tego klasy.

    > Po drugie, nie ma sposobu na zamknięcie serwera, poza zabiciem procesu. Chyba, że
    ja czegoś nie widzę.

    Tak. Funkcja server_stop() już istniała, ale ją usunąłem. To nie jest oczywiste, jak
    zamknąć serwer, który ma callbacki, niektóre zapewne w trakcie pracy.
    Wszystkie problemy da się rozwiązać, ale nie o to chodziło w wersji 1.0.

    > Mówiąc o API: 6 wariantów register_{generic,html,text}_{post,get}_action można by
    sprowadzić do 2. register_action(const char* name, {post_action_type,
    get_action_type} callback, const char* mime_type).

    Nie, bo po pierwsze generic i html różnią się obsługą a po drugie nie chciałem
    przeciążać funkcji register, bo bardziej naturalne wydaje mi się przeciążenie funkcji
    akcji dla get i post:

    void my_action(to-co-trzeba-dla-get) { ... }
    void my_action(to-co-trzeba-dla-post) { ... }

    I wtedy nie dałoby rady:

    register(my_action);

    > Zresztą, może lepiej byłoby przyjmować jako argument mapę akcji - czyli to co masz
    teraz w get_actions/post_actions. Niech user sobie przygotuje takie mapy w sposób,
    jaki mu pasuje, a ty pozbędziesz się potrzeby blokowania tych struktur.

    Ale teraz obsługa jest prostsza, właśnie dlatego, że user nie musi robić takich map.
    Można by było pomyśleć o akcji catch-all. Tam user dostawałby wszystko (co nie było
    obsłużone) i mógłby sobie tam zrobić takie mapy, jakie zechce.

    > Czasem funkcje przyjmują const char*, czase std::string& co jest niespójne.

    Bo chodziło o przewidywane użycie. Tam gdzie przewidywałem literał, jest const char*.

    > W ogóle nie walidujesz, czy wskaźniki są niepuste. Tak samo z std::function.

    A po co? Bez przesady z tą walidacją. Walidować należy input z zewnątrz (i nawet
    opisałem to w przykładzie 3, z parametrami) a nie własne literały.

    > Zero testów. Serio? :)

    Są testy. W katalogu, który dla zmylenia przeciwnika nazywa się examples. :-)

    A jakieś inne testy byś chciał?

    --
    Maciej Sobczak * http://www.inspirel.com

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: