Hallo tweakers,
Ik ben bezig met het schrijven van een HTTP Server in C++. Dit lukt allemaal aardig. Ik heb nu alleen ergens iets onhandigs.
Ik heb een server functie, deze zit in een oneindige loop en accept clients. Voor elke client word er dan een apparte thread aan gemaakt (QThread). In deze thread word het http protocol behandeld. Gaat dit allemaal ok, dan word er een site handler aan geroepen (aan de hand van 'virtual hosts'). Maar deze site handler is aan apparte class, dus los van de http handler etc.
Het komt dus hier op neer, ik heb de site handler een friend class gemaakt van de http handler. De http handler called een functie in de sitehandler (static) en geeft een object van de http handler mee (deze http handler bevat function voor de header, body, etc.) Maar zodra ik een site handler schrijf, dus een extend op de site handler, kan deze geen protected functies aan roepen op de pointer naar de http handler. Ik heb dit als volgd opgelost:
Het is misschien ook handig om te weten dat de SiteHandlers 'los van de source' worden toegevoegd. Daar mee bedoel ik, de source achter de hele server etc. is gewoon standaart, maar je kan zelf dus apart sites toevoegen door in een map site handlers toe te voegen.
Maar is het ook mogelijk om in de HTTPHandler alle extends van SiteHandler ook friend classes te maken?
Ik ben bezig met het schrijven van een HTTP Server in C++. Dit lukt allemaal aardig. Ik heb nu alleen ergens iets onhandigs.
Ik heb een server functie, deze zit in een oneindige loop en accept clients. Voor elke client word er dan een apparte thread aan gemaakt (QThread). In deze thread word het http protocol behandeld. Gaat dit allemaal ok, dan word er een site handler aan geroepen (aan de hand van 'virtual hosts'). Maar deze site handler is aan apparte class, dus los van de http handler etc.
Het komt dus hier op neer, ik heb de site handler een friend class gemaakt van de http handler. De http handler called een functie in de sitehandler (static) en geeft een object van de http handler mee (deze http handler bevat function voor de header, body, etc.) Maar zodra ik een site handler schrijf, dus een extend op de site handler, kan deze geen protected functies aan roepen op de pointer naar de http handler. Ik heb dit als volgd opgelost:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| class HTTPHandler : .... { ... void echo(const string& str); void set_header(const string& key, const string& value); ... friend class SiteHandler; }; class SiteHandler{ protected: void echo(HTTPHandler* root, cont string& str){ root->echo(str); } void set_header(HTTPHandler* root, const string& key, const string& value){ root->set_header(key, value); } }; class Example_Com : public SiteHandler{ protected: ... static handler(HTTPHandler* root){ set_header(root, "content-type", "text/html"); echo(root, "bla\n"); ... } ... }; |
Het is misschien ook handig om te weten dat de SiteHandlers 'los van de source' worden toegevoegd. Daar mee bedoel ik, de source achter de hele server etc. is gewoon standaart, maar je kan zelf dus apart sites toevoegen door in een map site handlers toe te voegen.
Maar is het ook mogelijk om in de HTTPHandler alle extends van SiteHandler ook friend classes te maken?