-
X-Received: by 2002:ad4:4cce:: with SMTP id i14mr223441qvz.207.1591644038701; Mon, 08
Jun 2020 12:20:38 -0700 (PDT)
X-Received: by 2002:ad4:4cce:: with SMTP id i14mr223441qvz.207.1591644038701; Mon, 08
Jun 2020 12:20:38 -0700 (PDT)
Path: news-archive.icm.edu.pl!news.icm.edu.pl!fu-berlin.de!news-out.google.com!nntp.g
oogle.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Mon, 8 Jun 2020 12:20:38 -0700 (PDT)
In-Reply-To: <a...@g...com>
Complaints-To: g...@g...com
Injection-Info: google-groups.googlegroups.com; posting-host=213.108.152.51;
posting-account=bMuEOQoAAACUUr_ghL3RBIi5neBZ5w_S
NNTP-Posting-Host: 213.108.152.51
References: <d...@g...com>
<3...@g...com>
<7...@g...com>
<a...@g...com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <d...@g...com>
Subject: Re: Embedded HTTP Server
From: Maciej Sobczak <s...@g...com>
Injection-Date: Mon, 08 Jun 2020 19:20:38 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Xref: news-archive.icm.edu.pl pl.comp.programming:214961
[ ukryj nagłówki ]> Żeby Twojego rozwiązania użyć w jakimś normalnym programie, trzeba stworzyć wątek.
Cała jedna linijka kodu. Której w prostych programach nawet nie trzeba (patrz
przykłady).
> Wygodne użycie, to byłoby coś takiego:
>
> int main() {
> auto server = std::make_unique<http::Server>(8008, ".");
>
> server->start();
Czyli też jedna dodatkowa linijka kodu, w dodatku zawsze, nawet w najprostszym
programie.
Więc na czym polega postęp?
> // tu się dzieje magia, która programista uprawia
> // a gdy się kończy scope, to server się sam zamyka
> }
Się tak łatwo nie zamyka, jeśli ma callbacki.
> > 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.
Przyłapałeś mnie. Skupiłem się na portach - faktycznie mapa jest wspólna.
Czyli twierdzisz, że ktoś będzie koniecznie chciał zrobić w jednym programie 5
serwerów na różnych portach, ale tak, żeby takie same linki robiły w nich różne
rzeczy?
To brzmi jak ostra perwersja. Tylko dlaczego ja mam w tym uczestniczyć?
Jeśli moja biblioteka miałaby swoją ułomnością powstrzymać kogoś przed tą perwersją,
to nawet uznałbym to za moralny sukces. :-)
> A, że masz ją współdzieloną, to też masz radosnego mutexa w głównej pętli.
I w czym ten mutex przeszkadza, skoro go nawet nie widać?
> 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.
O ile wszystkie wrócą. Zobacz przykład 6. Można go przepisać tak, że to funkcja
get_updates() będzie robić to, co activity(). Czyli nigdy nie wróci.
Ale owszem, jest to możliwe rozwiązanie, tylko wymaga zmiany koncepcji komunikacji.
Teraz, w prostej implementacji, jest to komunikacja blokująca. Wątek obsługujący
połączenie nie wróci, jeśli utknął na odczycie z gniazda (a w tym stanie spędza
większość czasu), dopóki *klient* tego połączenia nie zamknie. Nie wystarczy sobie
ustawić flagę.
Można to rozwiązać wprowadzając dodatkowe mechanizmy typu select() albo poll(), ale
zrobienie tego dobrze to złożoność porównywalna z całą resztą kodu i to są właśnie
problemy, których nie chciałem rozwiązywać w wersji 1.0.
Ten problem jest rozwiązany w bibliotece YAMI4, ale to zupełnie inna liga.
> To jest koślawe, sorry. W HTTP masz nie tylko akcje GET i POST, ale i chyba ze 20
innych.
Ale ja nie obiecuję obsługi tych 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.
Przecież właśnie tak jest. Dlatego funkcje dla POST mają dodatkowy argument istream -
tam są te dane, które normalni ludzie przekazują.
I właśnie dlatego funkcje dla GET i POST *różnią się* sygnaturami.
> 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".
Czyli że:
register(make_get_action(my_action));
jest lepsze od:
register_get_action(my_action);
Sorry - ani trochę.
> > 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.
Ale dlaczego ma się koncentrować na błędach w kodzie, którego używa, skoro takich nie
znalazł a za to ma błędy w swoim? :-)
I czym się różni pomyłka polegająca na użyciu pustego wskaźnika od pomyłki
polegającej na użyciu wskaźnika do niewłaściwej funkcji?
Otóż niczym się nie różni - a kompleksowe rozwiązanie tego zagadnienia (czyli
zapewnienie, że programista sięgnął po właściwą funkcję) nie leży po stronie użytej
biblioteki. To jest jedno z częstych nieporozumień w temacie weryfikacji albo
defensywnego kodowania.
Na tej podstawie zakładam, że programista poda wskaźnik do właściwej funkcji. To
założenie jest częścią kontraktu tej biblioteki.
> > 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ć.
Uwaga, szpan: pokrycie strukturalne zapewniłem testami systemowymi.
Bez przesady z tymi testami.
--
Maciej Sobczak * http://www.inspirel.com
Następne wpisy z tego wątku
- 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
- 10.06.20 07:50 Tomasz Kaczanowski
- 10.06.20 08:09 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-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 ;)
- 2025-01-18 znowu kradno i sie nie dzielo
- 2025-01-18 Zieloni oszuchiści
- 2025-01-18 Zielonka => Specjalista ds. public relations <=
- 2025-01-18 Warszawa => Frontend Developer (JS, React) <=
- 2025-01-18 Warszawa => Software .Net Developer <=
- 2025-01-18 Warszawa => Developer .NET (mid) <=
- 2025-01-18 Katowice => Administrator IT - Systemy Operacyjne i Wirtualizacja <=
- 2025-01-17 Zniknął list gończy za "Frogiem". Frog się nam odnalazł?
- 2025-01-17 Kto wytłumaczy "głupiemu" prezydentowi Dudzie wielką moc prawną "dekretu premiera" TUSKA? [(C)Korneluk (2025)]