Lighttpd & FastCGI config probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Ik probeer FastCGI aan te praat te krijgen in Lighttpd om een website te (kunnen) maken in c/c++.

De (test) website heb ik al:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "fcgi_stdio.h" /* fcgi library; put it first*/

#include <stdlib.h>

int count;

void initialize(void)
{
  count=0;
}

void main(void)
{
/* Initialization. */  
  initialize();

/* Response loop. */
  while (FCGI_Accept() >= 0)   {
    printf("Content-type: text/html\r\n"
           "\r\n"
           "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
           "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
           "Request number %d running on host <i>%s</i>\n",
            ++count, getenv("SERVER_HOSTNAME"));
  }
}


Wat succesvol gecompileerd is naar een bestandje met het commandje:
code:
1
gcc -o test -lfcgi test.c


Als ik het bestand vervolgens uitvoer in terminal, gaat dat prima:
code:
1
2
3
4
root@toby-desktop:/home/toby/Desktop# ./test
Content-type: text/html

<title>FastCGI Hello! (C, fcgi_stdio library)</title><h1>FastCGI Hello! (C, fcgi_stdio library)</h1>Request number 1 running on host <i>(null)</i>


Deze "website" wil ik aan de praat krijgen in lighttpd. Lighttpd heb ik geinstalleerd via synaptics package manager en volgens de bijgesloten readme.

Uiteindelijk heb ik een werkende webserver welke ik kon bereiken via localhost en mijn eigen IP.

Nu, om mijn fastcgi bin aan de praat te krijgen heb ik gekloot aan de config files.

Het binnetje is hernoemd en verplaatst naar "/var/www/helloweb". Mijn configfile'tje, wat opgeslagen is in "/etc/lighttpd/conf-available" en te bereiken is via een dynamic link in "/etc/lighttpd/conf-enabled" heet "10-fastcgi.conf" en heeft de volgende inhoud, wat grotendeels het resultaat is van hopeloos googlen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
## FastCGI programs have the same functionality as CGI programs,
## but are considerably faster through lower interpreter startup
## time and socketed communication
##
## Documentation: /usr/share/doc/lighttpd-doc/fastcgi.txt.gz
##                http://www.lighttpd.net/documentation/fastcgi.html

server.modules   += ( "mod_fastcgi" )

## Start an FastCGI server for php (needs the php5-cgi package)
#fastcgi.server    = ( ".php" => 
#   ((
#       "bin-path" => "/usr/bin/php-cgi",
#       "socket" => "/tmp/php.socket",
#       "max-procs" => 2,
#       "idle-timeout" => 20,
#       "bin-environment" => ( 
#           "PHP_FCGI_CHILDREN" => "4",
#           "PHP_FCGI_MAX_REQUESTS" => "10000"
#       ),
#       "bin-copy-environment" => (
#           "PATH", "SHELL", "USER"
#       ),
#       "broken-scriptfilename" => "enable"
#   ))
#)

fastcgi.server = ( "" =>((
"bin-path" => "/var/www/helloweb",
"max-procs" => 1,
"socket" => "/tmp/helloweb.socket",
"check-local" => "disable"
)))


Tot slot een lijstje ingestelde rechten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@toby-desktop:/etc/lighttpd/conf-enabled# ls -o
total 0
lrwxrwxrwx 1 root 44 2009-11-16 06:39 10-fastcgi.conf -> /etc/lighttpd/conf-available/10-fastcgi.conf

root@toby-desktop:/var/www# ls -o
total 12
-rwxrwxrwx 1 www-data 9259 2009-11-16 06:10 helloweb

root@toby-desktop:/tmp# ls -o
total 44
srwxr-xr-x 1 root        0 2009-11-16 07:10 gedit.root.1862093313
srwxr-xr-x 1 toby        0 2009-11-16 06:58 gedit.toby.569244332
srwxr-xr-x 1 www-data    0 2009-11-16 06:53 helloweb.socket-0
drwx------ 2 toby     4096 2009-11-16 04:48 keyring-CuxirR
drwx------ 2 toby     4096 2009-11-16 04:53 libgksu-tMcYY9
drwx------ 2 root     4096 2009-11-16 07:10 orbit-root
drwx------ 2 toby     4096 2009-11-16 07:06 orbit-toby
drwx------ 2 toby     4096 2009-11-16 05:23 plugtmp
drwx------ 2 toby     4096 2009-11-16 04:48 pulse-A9DbEQSUq3lX
drwx------ 2 toby     4096 2009-11-16 04:48 seahorse-GJtb2t
-rw------- 1 nobody    226 2009-11-16 05:17 sess_db862n3aq00ik5t57gpujopdr2
drwx------ 2 toby     4096 2009-11-16 04:48 ssh-gfHELf3561
drwx------ 3 toby     4096 2009-11-16 04:48 tracker-toby
drwx------ 2 toby     4096 2009-11-16 04:48 virtual-toby.JR46nX


Nou is het probleem: het werkt niet.
Als ik mijn localhost nu bezoek, met de nieuwe config (en na restarten van server) krijg ik "500 - Internal Server Error".


In de errorlog is het volgende te vinden:
code:
1
2
3
4
5
2009-11-16 07:13:01: (server.c.1475) server stopped by UID = 0 PID = 15610 
2009-11-16 07:13:02: (log.c.75) server started 
2009-11-16 07:13:12: (mod_fastcgi.c.2489) unexpected end-of-file (perhaps the fastcgi process died): pid: 15639 socket: unix:/tmp/helloweb.socket-0 
2009-11-16 07:13:12: (mod_fastcgi.c.3256) child signaled: 11 
2009-11-16 07:13:12: (mod_fastcgi.c.3299) response not received, request sent: 862 on socket: unix:/tmp/helloweb.socket-0 for / , closing connection


Nou zal het me niets verbazen als ik de rechten/owner weer verkeerd ingestelt heb. Ik heb altijd ruzie met linux's rechten systeem; gebruik linux nog maar een paar maanden als hoofd-OS.

Vergeet me de eventuele onduidelijkheid; heb niet eens geslapen en het is al ochtend :P

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Nu is 't wellicht een long-shot en ik ben verder heulemaal geen programmeur, dus als dit nergens op slaapt, gaarne negeren :+

Maar moet een C-programma niet altijd afgesloten worden met "return 0;"?

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
In dit geval is het return-type van de functie "void" en niet "int", dus het lijkt me niet.
Bovendien werkt het programma wel via terminal. Bovendien heb ik de code letterlijk van een FastCGI tutorial geplukt.

edit: ach ja. Ik probeer het gewoon 'ff :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "fcgi_stdio.h" /* fcgi library; put it first*/

#include <stdlib.h>

int count;

int main(){
  count = 0;
  while (FCGI_Accept() >= 0)   {
    printf("Content-type: text/html\r\n"
           "\r\n"
           "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
           "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
           "Request number %d running on host <i>%s</i>\n",
            ++count, getenv("SERVER_HOSTNAME"));
  }
  return 0;
}


Totaal geen verschil. Wel nettere code :P

[ Voor 87% gewijzigd door Gamebuster op 16-11-2009 07:32 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Dat bedoel ik, gewoon negeren die stomme posts van mij :+

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Osiris schreef op maandag 16 november 2009 @ 07:55:
Dat bedoel ik, gewoon negeren die stomme posts van mij :+
Ach ja, die "nutteloze reacties" bumpen het topic, dus... :D

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 15-09 20:20
Deze lijn in de log:

2009-11-16 07:13:12: (mod_fastcgi.c.3256) child signaled: 11

Zou wijzen op een SIGSEGV.

Kun je het wellicht eens wat eenvoudiger in perl even iets proberen?

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 18:39

Matis

Rubber Rocket

http://redmine.lighttpd.net/boards/2/topics/1614

Iemand met dezelfde (fout)melding en zijn/haar oplossing ;)
For anyone who might be interested:

I have figured out what was causing this crash
The example in the mod_fastcgi documentation has the line

int size = 200;

200 should cover the number of "non-environment" characters (ie html code). However, this is too low if you have (like my system) 26 different environment variables. I have changed it to: "int size = 500;" which did the trick
Beter is het dat je je mainloop EXIT_SUCCESS laat returnen ;)

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "fcgi_stdio.h" /* fcgi library; put it first*/

#include <stdlib.h>

int count;

int main(){
  count = 0;
  while (FCGI_Accept() >= 0)   {
    printf("Content-type: text/html\r\n"
           "\r\n"
           "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
           "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
           "Request number %d running on host <i>%s</i>\n",
            ++count, getenv("SERVER_HOSTNAME"));
  }
  return EXIT_SUCCESS;
}

[ Voor 84% gewijzigd door Matis op 16-11-2009 08:19 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Ik heb niks aan perl; ga ik niks mee doen. Dan moet ik uitvissen hoe perl werkt en hoe ik dat aan de praat krijg.
Is er geen andere mogelijkheid?

Wat is een SIGSEGV? *google't*

Ik heb namelijk 0.0 verstand van perl.

[ Voor 10% gewijzigd door Gamebuster op 16-11-2009 08:25 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Matis schreef op maandag 16 november 2009 @ 08:17:
http://redmine.lighttpd.net/boards/2/topics/1614

Iemand met dezelfde (fout)melding en zijn/haar oplossing ;)

[...]


Beter is het dat je je mainloop EXIT_SUCCESS laat returnen ;)

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "fcgi_stdio.h" /* fcgi library; put it first*/

#include <stdlib.h>

int count;

int main(){
  count = 0;
  while (FCGI_Accept() >= 0)   {
    printf("Content-type: text/html\r\n"
           "\r\n"
           "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
           "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
           "Request number %d running on host <i>%s</i>\n",
            ++count, getenv("SERVER_HOSTNAME"));
  }
  return EXIT_SUCCESS;
}
Code gecompileerd met succes. Resultaat werkt in terminal, maar nog steeds een 500 internal server error.

Nieuwe log-lijntjes:
code:
1
2
3
4
5
6
7
8
2009-11-16 08:21:15: (server.c.1475) server stopped by UID = 0 PID = 18102 
2009-11-16 08:21:16: (log.c.75) server started 
2009-11-16 08:21:25: (mod_fastcgi.c.2489) unexpected end-of-file (perhaps the fastcgi process died): pid: 18131 socket: unix:/tmp/helloweb.socket-0 
2009-11-16 08:21:25: (mod_fastcgi.c.3256) child signaled: 11 
2009-11-16 08:21:25: (mod_fastcgi.c.3299) response not received, request sent: 862 on socket: unix:/tmp/helloweb.socket-0 for / , closing connection 
2009-11-16 08:21:25: (mod_fastcgi.c.2489) unexpected end-of-file (perhaps the fastcgi process died): pid: 18137 socket: unix:/tmp/helloweb.socket-0 
2009-11-16 08:21:25: (mod_fastcgi.c.3256) child signaled: 11 
2009-11-16 08:21:25: (mod_fastcgi.c.3299) response not received, request sent: 862 on socket: unix:/tmp/helloweb.socket-0 for / , closing connection


Overigens vermoed ik zelf dat het meer een config/rechten kwestie is.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 18:39

Matis

Rubber Rocket

code:
1
2009-11-16 08:21:25: (mod_fastcgi.c.2489) unexpected end-of-file (perhaps the fastcgi process died): pid: 18131 socket: unix:/tmp/helloweb.socket-0

Terwijl je dat niet in de console hebt, vreemd :/

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Matis schreef op maandag 16 november 2009 @ 08:35:
code:
1
2009-11-16 08:21:25: (mod_fastcgi.c.2489) unexpected end-of-file (perhaps the fastcgi process died): pid: 18131 socket: unix:/tmp/helloweb.socket-0

Terwijl je dat niet in de console hebt, vreemd :/
code:
1
2
3
4
root@toby-desktop:/home/toby/Desktop# /var/www/helloweb
Content-type: text/html

<title>FastCGI Hello! (C, fcgi_stdio library)</title><h1>FastCGI Hello! (C, fcgi_stdio library)</h1>Request number 1 running on host <i>(null)</i>


en

code:
1
"bin-path" => "/var/www/helloweb",


Dus daar zou het niet aan kunnen liggen.

De "owner/group" van de bestanden aanpassen (en restart) heeft ook geen bijwerking.

[ Voor 14% gewijzigd door Gamebuster op 16-11-2009 08:42 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 18:39

Matis

Rubber Rocket

Misschien een heel vreemd iets, maar als je nu eens de <html> <head> en <body> tags toevoegt?

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Matis schreef op maandag 16 november 2009 @ 08:48:
Misschien een heel vreemd iets, maar als je nu eens de <html> <head> en <body> tags toevoegt?
Dat hoort totaal geen effect te hebben.

Overigens heb ik de volgende code geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  #include <stdio.h>

    #include <stdlib.h>

    void main(void)
    {
        int count = 0;
        printf("Content-type: text/html\r\n"
               "\r\n"
               "<title>CGI Hello!</title>"

               "<h1>CGI Hello!</h1>"
               "Request number %d running on host <i>%s</i>\n",
               ++count, getenv("SERVER_NAME"));
    }


En kreeg nu wat anders in de log:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
2009-11-16 08:47:16: (log.c.75) server started 
Content-type: text/html



<title>CGI Hello!</title><h1>CGI Hello!</h1>Request number 1 running on host <i>(null)</i>
2009-11-16 08:47:16: (mod_fastcgi.c.1047) the fastcgi-backend /var/www/helloweb failed to start: 
2009-11-16 08:47:16: (mod_fastcgi.c.1051) child exited with status 118 /var/www/helloweb 
2009-11-16 08:47:16: (mod_fastcgi.c.1054) If you're trying to run PHP as a FastCGI backend, make sure you're using the FastCGI-enabled version.
You can find out if it is the right one by executing 'php -v' and it should display '(cgi-fcgi)' in the output, NOT '(cgi)' NOR '(cli)'.
For more information, check http://trac.lighttpd.net/trac/wiki/Docs%3AModFastCGI#preparing-php-as-a-fastcgi-programIf this is PHP on Gentoo, add 'fastcgi' to the USE flags. 
2009-11-16 08:47:16: (mod_fastcgi.c.1358) [ERROR]: spawning fcgi failed. 
2009-11-16 08:47:16: (server.c.908) Configuration of plugins failed. Going down.


Dat laat in ieder geval zien dat-ie wel het juiste bestand te pakken heeft en dat-ie het kan uitvoeren. Ik ga weer 'ff andere codes proberen...

code:
1
2
FastCGI Hello!
Request number 1 running on host 62.212.129.157


OMG ITS WORKING :D :D

<+:)

Oplossing:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   #include "fcgi_stdio.h"
    #include <stdlib.h>

    void main(void)
    {
        int count = 0;
        while(FCGI_Accept() >= 0)
            printf("Content-type: text/html\r\n"
                   "\r\n"

                   "<title>FastCGI Hello!</title>"
                   "<h1>FastCGI Hello!</h1>"
                   "Request number %d running on host <i>%s</i>\n",
                    ++count, getenv("SERVER_NAME"));
    }


Geen flauw idee waarom het werkt.

Nu kan ik eindelijk slapen........ om 9 uur in de ochtend... |:(

Laat maar; paar blikjes red bull and en CoD:MW2 houden me wel wakker.

[ Voor 16% gewijzigd door Gamebuster op 16-11-2009 08:54 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Als ik eerder wakker was geweest had ik je wel kunnen vertellen dat de fout waarschijnlijk zit in het passen van een NULL-pointer naar printf() als string-argument. Dat is verboden! ;)

glibc print soms <null> in plaats van te crashen op een NULL pointer. Op zich is dat geldig gedrag, maar het heeft wel als nadeel dat je dit soort fouten makkelijker over het hoofd ziet.

De reden dat je laatste post wel werkt is dat je daar de correcte variabelenaam (SERVER_NAME) gebruikt en in de oorspronkelijke code een ongedefineerde variabele (SERVER_HOSTNAME). Daar kwam je NULL-pointer vandaan. Het beste is natuurlijk om er niet blind vanuit te gaan dat zulke variabelen gedefinieerd zijn en dus expliciet te checken of getenv() NULL returnt.
Osiris schreef op maandag 16 november 2009 @ 07:21:
Maar moet een C-programma niet altijd afgesloten worden met "return 0;"?
Op zich is het wel zo netjes om main met int als returntype te declareren en af te sluiten met return 0; (hoewel ik niet zeker weet of dat verplicht is in C) maar in het geval van FastCGI kan het daar niet op misgaan, aangezien je normaal gesproken binnen de accept-loop bezig blijft. Je komt er pas uit als de server afsluit.

[ Voor 5% gewijzigd door Soultaker op 16-11-2009 12:12 ]


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Soultaker schreef op maandag 16 november 2009 @ 12:10:
Als ik eerder wakker was geweest had ik je wel kunnen vertellen dat de fout waarschijnlijk zit in het passen van een NULL-pointer naar printf() als string-argument. Dat is verboden! ;)

glibc print soms <null> in plaats van te crashen op een NULL pointer. Op zich is dat geldig gedrag, maar het heeft wel als nadeel dat je dit soort fouten makkelijker over het hoofd ziet.

De reden dat je laatste post wel werkt is dat je daar de correcte variabelenaam (SERVER_NAME) gebruikt en in de oorspronkelijke code een ongedefineerde variabele (SERVER_HOSTNAME). Daar kwam je NULL-pointer vandaan. Het beste is natuurlijk om er niet blind vanuit te gaan dat zulke variabelen gedefinieerd zijn en dus expliciet te checken of getenv() NULL returnt.


[...]

Op zich is het wel zo netjes om main met int als returntype te declareren en af te sluiten met return 0; (hoewel ik niet zeker weet of dat verplicht is in C) maar in het geval van FastCGI kan het daar niet op misgaan, aangezien je normaal gesproken binnen de accept-loop bezig blijft. Je komt er pas uit als de server afsluit.
Dat verklaart waarom ik vaker dezelfde melding weer terugkrijg wanneer ik met getenv iets opvraag wat niet bestaat. Het valt me nu pas op dat ik dus uren heb gekloot door 1 typfoutje... :P
Ach ja... is niet de 1e keer dat ik zoiets heb :P

Ik heb nu wel weer 2 nieuwe vragen:

-UTF-8. Hoe UTF-8 te verwerken? Als ik de lengte van een "string" met een euroteken opvraag krijg ik "3" ipv "1". Nou is dit niks nieuws voor mij, maar is er een goede manier voor het werken met UTF-8 strings en deze eventueel te converteren vanuit en naar andere tekensets. Ik heb al gekeken naar iconv, maar daar wordt ik niet veel wijzer van. Ik ben via googlen heel vaak gnome en kde's ustring.h's documentatie tegengekomen, maar nooit het bestand zelf, terwijl die me toch wel mooi lijkt, zover ik de documentatie ervan had begrepen.

-Is er nergens een goede FastCGI documentatie waar een lijst met alle env-variablen staat en waar staat waar geuploade bestanden heen verdwijnen?
Liefst met werkende voorbeelden en uitleg etc, beetje zoals w3schools of php.net
Ik heb aardig lopen zoeken maar vreemd genoeg kom ik niet echt overzichtelijke lijsten, referenties en documentaties tegen.

Op dit moment gebruik ik de volgende (redelijk grote) code om postdata in te lezen:
http://levensweg.net/host/3ED4819D/website/request.h
(ik vind het groot voor het simpel inlezen van een tekenreeks wat ik in PHP met een paar regels zou kunnen)
en de overige files zijn:
http://levensweg.net/host/3ED4819D/?website/

Het zal ongetwijveld een slordige code zijn met 100 slordigheidsfouten... maar het is ook nog maar mijn 1e werkende C/C++ code die meer kan dan enkel "hello world" eruit gooien. :P

[ Voor 4% gewijzigd door Gamebuster op 21-11-2009 01:27 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Gamebuster schreef op zaterdag 21 november 2009 @ 01:22:
-UTF-8. Hoe UTF-8 te verwerken? Als ik de lengte van een "string" met een euroteken opvraag krijg ik "3" ipv "1". Nou is dit niks nieuws voor mij, maar is er een goede manier voor het werken met UTF-8 strings en deze eventueel te converteren vanuit en naar andere tekensets.
In C/C++ heb je twee voor de hand liggende opties: of gewoon lekker in UTF-8 laten (de codering maakt voor veel operaties weinig uit) of converteren naar een wide character string (<wchar.h> includen in C).

Converteren met iconv is de minst ingrijpende methode (maar gedoe omdat je zelf buffers moet alloceren, al kun je voor conversie van UTF-8 naar wchar_t de lengte van de invoer als bovengrens nemen voor de uitvoer). Als je een makkelijkere manier wil, kun je kijken naar de conversieroutine van Glib.
Is er nergens een goede FastCGI documentatie waar een lijst met alle env-variablen staat en waar staat waar geuploade bestanden heen verdwijnen?
Voor zover ik weet stelt FastCGI dezelfde environmental variables in als CGI, dus met de CGI specificatie zou je een heel eind moeten kunnen komen (die is niet zo uitgebreid). POST data komt binnen via stdin. Geüploadde bestanden worden meestal in MIME formaat gecodeerd.
Op dit moment gebruik ik de volgende (redelijk grote) code om postdata in te lezen:
http://levensweg.net/host/3ED4819D/website/request.h
Juist, dit is voor het parsen van URL-encoded data, te herkennen aan de inhoud van de CONTENT_TYPE variabele die dan application/x-www-form-urlencoded als waarde heeft. Uploads worden meestal niet zo gecodeerd, maar in MIME formaat (CONTENT_TYPE is dan multipart/form-data).

(BTW: source code in een header file :?)
ik vind het groot voor het simpel inlezen van een tekenreeks wat ik in PHP met een paar regels zou kunnen
Ja, logisch, want CGI is bedoeld als interface tussen native applicaties en webservers, terwijl PHP gemaakt is om webpagina's in te schrijven. PHP handelt alle details zoals het parsen van invoer al voor je af. ;)

Als je het jezelf wat makkelijker wil maken, kun je een meer high-level library gebruiken. Ik heb lang geleden (in de jaren 90) Thomas Boutell's CGIC library gebruikt, wat prima werkte (maar is alleen voor CGI, niet FastCGI, voor zover ik weet, en ik heb er geen recente ervaring mee dus wellicht is het wat gedateerd). Voor C++ vind ik met Google al GNU Cgicc voor C++ en FastCGI, maar er is vast meer te vinden.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

Even een tikje terug naar PRG aangezien we nu zijn aanbeland bij een C implementatie ;)
offtopic:
Overigens gaat het eerst deel van je topic over server configuratie en dat hoort in Serversoftware en Windows Servers en en niet in Software Engineering & Architecture

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Gamebuster schreef op zaterdag 21 november 2009 @ 01:22:
Het zal ongetwijveld een slordige code zijn met 100 slordigheidsfouten... maar het is ook nog maar mijn 1e werkende C/C++ code die meer kan dan enkel "hello world" eruit gooien. :P
Ik zou C++ gebruiken in plaats van C.
Ik heb ook een aantal C++ FastCGI apps. Deze gebruiken Boost Asio met een zelfgeschreven FastCGI implementatie. De app laat ik ook niet door de web server opstarten, maar ik start hem zelf. Zo kan ik de app eenvoudig onder de debugger draaien, misschien is dat in jouw geval ook mogelijk.

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
@Olaf:

Ik probeerde C++ te gebruiken, maar input en output gaat enkel via stdin en printf.... en dat zijn C functies.

Zou ik wat code mogen zien van jouw projectjes met eventuele compiler-instructies zodat ik 'ff wat kan rondtesten? Liefst een beetje kleinere code zodat ik er wat van begrijp :9

Ik moet zeggen dat de beschikbare informatie op internet nogal mager is. Ik zit al tijden te zoeken hoe ik cookies kan inlezen, maar kom echt totaal niets tegen. Cookies worden meegezonden met de request headers, maar nergens staat hoe je die headers kan inlezen... althans, ik heb het nog niet gevonden.

@soultaker:
Maakt het uit of er een .h of een .c staat dan?
Op dit moment gebruik ik .h voor groepen functies en classes en .c voor code die gebruik maakt van de functies en classes. Ik snap nog niet veel van dat c/c++

[ Voor 5% gewijzigd door Gamebuster op 02-12-2009 00:04 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
De conventie is (zeker in C) dat je in header files (.h) datastructuren en functies declareert, en de definitie (implementaite) van functies in source files (.c) staat. Header files kunnen dan in meerdere compilation units ingevoegd worden. Zet dus liever je "groepen functies en classes" in .c files.

In C++ is het iets vager omdat inline-methoden wél in header files staan, maar globaal geldt hetzelfde principe.

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Gamebuster schreef op woensdag 02 december 2009 @ 00:00:
Ik probeerde C++ te gebruiken, maar input en output gaat enkel via stdin en printf.... en dat zijn C functies.

Zou ik wat code mogen zien van jouw projectjes met eventuele compiler-instructies zodat ik 'ff wat kan rondtesten? Liefst een beetje kleinere code zodat ik er wat van begrijp :9
C functies zijn prima vanuit C++ aan te roepen, dus ik zou alsnog C++ gebruiken. Ik zal eens kijken of ik een Hello World kan posten.

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Olaf van der Spek schreef op woensdag 02 december 2009 @ 10:59:
[...]

C functies zijn prima vanuit C++ aan te roepen, dus ik zou alsnog C++ gebruiken. Ik zal eens kijken of ik een Hello World kan posten.
Daar was ik al achter, immers, in princiepe compileer ik met gcc waarbij c++ functies gewoon werken. Echter, cout en cin kan ik niet gebruiken. Ik moet in plaats daarvan stdin en stdout gebruiken.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Dat zal best. Maar dat is geen punt, toch?

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Olaf van der Spek schreef op zondag 06 december 2009 @ 21:12:
Dat zal best. Maar dat is geen punt, toch?
Kan je dan gewoon
code:
1
stdout << "hoi"
gebruiken?
Niet eens geprobeerd eigenlijk...

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Ik denk dat Olaf van der Spek bedoelt dat je ook gewoon printf e.d. kunt gebruiken terwijl je verder wel allerlei C++-features gebruikt.

Normaal gesproken zijn std::cout, std::cin en std::cerr gelinkt aan stdout, stdin en stderr, dus kun je de C en C++ functies/operators door elkaar gebruiken. Maar hoe dat in FastCGI precies werkt weet ik niet, want daar worden die stream vast geredirect op de een of andere manier...

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Ik vraag me echt nog steeds af (ik heb het nog steeds niet gevonden) hoe je iets simpels als request headers (o.a. cookies!) inleest. Is er niemand die 'ff een simpel antwoord kan geven?

Post-data inlezen heb ik al, query-string inlezen gaat ook, maar cookies en overige meegezonden headers kan ik maar niet vinden.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Je krijgt de request headers in environmental variables met prefix HTTP_, dus cookies kun je uit HTTP_COOKIE halen.

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Soultaker schreef op dinsdag 08 december 2009 @ 00:22:
Je krijgt de request headers in environmental variables met prefix HTTP_, dus cookies kun je uit HTTP_COOKIE halen.
Ah! die werkt :D

Danke :D

Let op: Mijn post bevat meningen, aannames of onwaarheden

Pagina: 1