-
Data: 2020-06-08 12:25:57
Temat: Re: Embedded HTTP Server
Od: Wojciech Muła <w...@g...com> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]On Saturday, June 6, 2020 at 9:00:07 PM UTC+2, Maciej Sobczak wrote:
> > 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ć.
Czyli ograniczasz użytkowników do jednego przypadku i to w sytuacji, gdy dodanie
jednego stopnia swobody nie kosztuje ani użytkownika, ani Ciebie nic.
> 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".
Żeby Twojego rozwiązania użyć w jakimś normalnym programie, trzeba stworzyć wątek.
Wygodne użycie, to byłoby coś takiego:
int main() {
auto server = std::make_unique<http::Server>(8008, ".");
// tu sobie programista coś inicjalizuje
server->start();
// tu się dzieje magia, która programista uprawia
// a gdy się kończy scope, to server się sam zamyka
}
> 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.
Stoi, bo masz współdzieloną mapę routingu. A, że masz ją współdzieloną, to też masz
radosnego mutexa w głównej pętli.
> > 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.
No i to jest defekt. Ja chcę, żeby mój program się zamykał w cywilizowany sposób.
Callbacki są wołane w wątkach, robisz sobie na nie barierę (czyli np. latch) po
zakończeniu głównej pętli i po kłopocie.
> > 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);
To jest koślawe, sorry. W HTTP masz nie tylko akcje GET i POST, ale i chyba ze 20
innych. Poza tym założenie, że ktoś będzie argumenty POST przesyłał w URL-u jest
zdziebko przestarzałe, o wiele wygodniej jest słać parametry w JSONie.
> > 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.
Pamiętanie o kilku wariantach funkcji nie jest prostsze. Już lepiej byłoby mieć jedną
przeciążoną metodę register i kilka pomocniczych funkcji w stylu "make_get_action".
> 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*.
const char* to nie tylko literały, tego założenia nie da się odczytać z API.
> > 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.
Bo programista się czasem myli, więc powinien się koncentrować na błędach w kodzie,
który pisze, a nie którego używa.
> > Zero testów. Serio? :)
>
> Są testy. W katalogu, który dla zmylenia przeciwnika nazywa się examples. :-)
>
> A jakieś inne testy byś chciał?
Np. testy jednostkowe parserów, których jest co najmniej ze 2. Jak widzę
5-krotnie zagnieżdżony kod, to nie wiem, czego się spodziewać.
w.
Następne wpisy z tego wątku
- 08.06.20 20:33 Maciej Sobczak
- 08.06.20 21:20 Maciej Sobczak
- 08.06.20 21:32 heby
- 08.06.20 22:43 Maciej Sobczak
- 08.06.20 23:24 heby
- 08.06.20 23:44 Maciej Sobczak
- 08.06.20 23:52 Maciej Sobczak
- 09.06.20 00:08 heby
- 09.06.20 00:22 heby
- 09.06.20 22:23 Maciej Sobczak
- 09.06.20 22:43 Maciej Sobczak
- 09.06.20 22:47 heby
- 09.06.20 23:14 Maciej Sobczak
- 09.06.20 23:15 heby
- 09.06.20 23:32 heby
Najnowsze wątki z tej grupy
- Popr. 14. Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
Najnowsze wątki
- 2025-01-20 Gdańsk => Programista Full Stack .Net <=
- 2025-01-20 Gliwice => Business Development Manager - Dział Sieci i Bezpieczeńst
- 2025-01-20 Warszawa => Full Stack .Net Engineer <=
- 2025-01-20 huta ruszyla
- 2025-01-20 piece wodorowe
- 2025-01-20 Lublin => Programista Delphi <=
- 2025-01-20 Warszawa => Architekt rozwiązań (doświadczenie w obszarze Java, AWS
- 2025-01-20 Mińsk Mazowiecki => Area Sales Manager OZE <=
- 2025-01-20 Bieruń => Spedytor Międzynarodowy (handel ładunkami/prowadzenie flo
- 2025-01-19 Test - nie czytać
- 2025-01-19 qqqq
- 2025-01-19 Tauron przysyła aneks
- 2025-01-19 Nowa ładowarka Moya a Twizy -)
- 2025-01-18 Power BANK z ładowaniem przelotowym robi PRZERWY
- 2025-01-18 Pomoc dla Filipa ;)