-
X-Received: by 2002:a05:620a:4d8:: with SMTP id 24mr9269643qks.219.1591611957545;
Mon, 08 Jun 2020 03:25:57 -0700 (PDT)
X-Received: by 2002:a05:620a:4d8:: with SMTP id 24mr9269643qks.219.1591611957545;
Mon, 08 Jun 2020 03:25:57 -0700 (PDT)
Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin3
!goblin.stu.neva.ru!news.misty.com!border2.nntp.dca1.giganews.com!nntp.giganews
.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.goog
legroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Mon, 8 Jun 2020 03:25:57 -0700 (PDT)
In-Reply-To: <7...@g...com>
Complaints-To: g...@g...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: <d...@g...com>
<3...@g...com>
<7...@g...com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <a...@g...com>
Subject: Re: Embedded HTTP Server
From: Wojciech Muła <w...@g...com>
Injection-Date: Mon, 08 Jun 2020 10:25:57 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Lines: 127
Xref: news-archive.icm.edu.pl pl.comp.programming:214959
[ ukryj 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
- 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
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
Najnowsze wątki
- 2025-01-04 Zbieranie danych przez www
- 2025-01-04 reverse engineering i dodawanie elementów do istniejących zamkniętych produktów- legalne?
- 2025-01-04 w Nowym Roku 2025r
- 2025-01-04 Warszawa => Specjalista ds. IT - II Linia Wsparcia <=
- 2025-01-04 Warszawa => Java Developer <=
- 2025-01-04 Warszawa => Spedytor Międzynarodowy <=
- 2025-01-04 Warszawa => System Architect (Java background) <=
- 2025-01-04 Wrocław => Application Security Engineer <=
- 2025-01-04 Chrzanów => Specjalista ds. public relations <=
- 2025-01-04 Katowice => Key Account Manager (ERP) <=
- 2025-01-03 Problem z odczytem karty CF
- 2025-01-03 Jazda z Warszawy do Krakowa teslą
- 2025-01-03 Wrocław => Konsultant Wdrożeniowy Comarch XL/Optima (Księgowość i
- 2025-01-03 Warszawa => International Freight Forwarder <=
- 2025-01-03 Mińsk Mazowiecki => Area Sales Manager OZE <=