🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.programming
Article #217029

Re: Embedded HTTP Server

#217029
From: Wojciech Muła
Date: Tue, 23 Jun 2020 07:33
77 lines
5658 bytes
On Monday, June 8, 2020 at 9:20:39 PM UTC+2, Maciej Sobczak wrote:
> > 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?

Na braku konieczności ręcznego tworzenia i zarządzania wątkiem.

> Się tak łatwo nie zamyka, jeśli ma callbacki.

Co mnie jako twórcę biblioteki obchodzi, że ktoś ma burdel w callbackach. Ja gwarantuję, że moje wątki się skończą jeśli skończą się callbacki.

> > 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ć?

Bo np. na jednym porcie masz dane dla userów, na drugim możesz dawać output z debuggera, profilera, co tam sobie robisz. Wiesz, to że Twój serwer jest prosty, nie znaczy, że aplikacja która go użyje też jest prosta. Gdyby była prosta, pewnie nikt by jej nie pisał w C++.

> > 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ć?

Bo mutexy są kosztowne czasowo. I akurat tego jednego mogłoby nie być.

> > 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ę.

Ale w końcu wróci, choćby przez timeout. I o to chodzi.

> > 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.

Super, więc jak będę chciał mieć operację DELETE albo PUT, to muszę sobie szukać innego rozwiązania.

> > 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.

No fajnie, tylko to sztuczne rozróżnienie. W protokole HTTP nie ma znaczenia typ akcji, zawsze masz ten same input, w akcji GET też możesz wysłać dane, np. JSONa.

> > 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ę.

Jest bardziej elastyczne i tyle. Ja wolę mieć jedną metodę i zrobić sobie odpowiednie konstruktory.
Zresztą, najlepiej byłby mieć register(my_action) i wybierać wariant za pomocą typetraits.

> > 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.

Chciałeś review, to masz. Ja wiem, że parsery klepane ręcznie nie mające testów to proszenie się o kłopoty, będą wcześniej, czy później.

w.
Technical Details
Message-ID: <7718052c-c349-4eae-a60d-7a6108cb1b38o@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!news.uzoreto.com!feeder1.cambriumusenet.nl!feed.tweak.nl!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
References: <d423a072-9378-441b-ba06-e0657a1fa53bo@googlegroups.com> <3e267b62-0fdf-41c2-9f9c-c316f98b85c6o@googlegroups.com> <7cd03711-5fee-4322-b02a-c803fcf43b31o@googlegroups.com> <a0edbb57-72ba-48f1-bf82-7060d1cec401o@googlegroups.com> <d95ffe9d-570f-455c-bb22-0831b8c0a0dfo@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a37:6609:: with SMTP id a9mr19062256qkc.337.1592897585936;        Tue, 23 Jun 2020 00:33:05 -0700 (PDT)
X-Received: by 2002:a05:620a:992:: with SMTP id x18mr12332425qkx.273.1592897585761; Tue, 23 Jun 2020 00:33:05 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!news.uzoreto.com!feeder1.cambriumusenet.nl!feed.tweak.nl!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Tue, 23 Jun 2020 00:33:05 -0700 (PDT)
In-Reply-To: <d95ffe9d-570f-455c-bb22-0831b8c0a0dfo@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: google-groups.googlegroups.com; posting-host=131.228.2.21; posting-account=VFwkXwoAAADdT4-lLKRZrMYkTjizGoyn
NNTP-Posting-Host: 131.228.2.21
References: <d423a072-9378-441b-ba06-e0657a1fa53bo@googlegroups.com> <3e267b62-0fdf-41c2-9f9c-c316f98b85c6o@googlegroups.com> <7cd03711-5fee-4322-b02a-c803fcf43b31o@googlegroups.com> <a0edbb57-72ba-48f1-bf82-7060d1cec401o@googlegroups.com> <d95ffe9d-570f-455c-bb22-0831b8c0a0dfo@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <7718052c-c349-4eae-a60d-7a6108cb1b38o@googlegroups.com>
Subject: Re: Embedded HTTP Server
From: Wojciech Muła <wojtek.mula@gmail.com>
Injection-Date: Tue, 23 Jun 2020 07:33:05 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit