Toon posts:

[c] post defined arguments

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik weet niet of ik de topic klopt, maar dit is mijn probleem:

Ik ben bezig met het maken van een webserver, om te kijken hoe dat precies werkt. Hij werkt wel, maar de code is enorm vies. In een poging om dit te verbeteren ben ik overnieuw begonnen en nu loop ik tegen een probleem aan bij het ontleden van de http-requests.

Elke parameter binnen het http-protocol wordt afgesloten met een <cr><lf>.
Ik wil een methode schrijven die x lines returned naar x argumenten die worden opgegeven in de header. Vergelijkbaar met de header van bijvoorbeeld sscanf en sprintf.

Ik heb al in de search gezocht, en de source van stdio.h doorgebladerd.
Maar ik heb niets kunnen vinden waar ik wat mee kan.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Uh wat dacht je van afgewisseld strchr(':) en strstr("\r\n") :?

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kun je een duidelijk voorbeeld geven, want ik snap niet zo goed wat je nu wilt...

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:14
Ik geloof dat 'ie een functie met een variabel aantal argumenten wil schrijven (dat maak ik tenminste uit het verhaal over sprintf/sscanf in de derde alinea op).

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Soultaker schreef op 15 april 2004 @ 13:56:
Ik geloof dat 'ie een functie met een variabel aantal argumenten wil schrijven (dat maak ik tenminste uit het verhaal over sprintf/sscanf in de derde alinea op).
Had ik ook begrepen, ik zie alleen de relatie niet met http headers :)

Ik gok dat ie ongeveer dit zoekt:
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
25
26
27
28
29
30
31
struct HttpHeader
  {
  char* FieldName;
  char* FieldValue;
  };

// Returns number of fields read, HttpMessage is set to beginning of body
int ExtractHttpFields(char** HttpMessage, HttpHeader** Headers)
{
int         HeaderCount = 0;
char*       EndOfLine;
char*       EndOfField;
HttpHeader* Header;

*Headers = NULL;
while(true)
  {
  EndOfLine  = strstr(*HttpMessage, "\r\n");
  EndOfField = strchr(*HttpMessage, ':');
  if(!EndOfLine || !EndOfField || EndOfLine < EndOfField)
    return HeaderCount;
  *Headers = realloc(*Headers, sizeof(HttpHeader) * (HeaderCount + 1));
  Header   = (*Headers)[HeaderCount++];
  Header->FieldName = *HttpMessage;
  *EndOfField = '\0';
  while(*(++(*EndOfField)) <= ' ' && *HttpMessage < EndOfLine);
  Header->FieldValue = EndOfField;
  *EndOfLine = '\0';
  *HttpMessage = EndOfLine + 2;
  }
}

Daar ik dit in Notepad heb ingeklopt geen idee of het werkt, maar tis ook maar een insteek voor TS om op voort te borduren :)

[ Voor 62% gewijzigd door curry684 op 15-04-2004 14:48 ]

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Volgens mij kun je beter gewoon een array maken van headers en hun waarden, die je dan kunt returnen (of je moet zelf een buffer meegeven aan de functie, dat is wat handiger wat betreft memory management)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Het is de bedoeling dat ik een aantal argumenten kan meegeven met een functie, zodat ik daar waarden aan kan meegeven. Maar het aantal argumenten is bij de functie zelf vooraf onbekend, dat moet at runtime worden gegenereerd.

Ik heb iets gevonden, het heet stdarg.h, als ik weet hoe ik het moet gebruiken zal ik het posten.

Zo ziet het eruit:
C:
1
2
3
4
5
6
7
8
#include <stdarg.h>

int foo(char *input, ...) {
    va_list ap;
    va_start(ap, input);

    [...]
}
curry684 schreef op 15 april 2004 @ 14:07:
[...]

Had ik ook begrepen, ik zie alleen de relatie niet met http headers :)
Die Headers, eindigen met een <cr><lf> en vooraf is niet bekend hoeveel headers de user-agent meegeeft. Maar dat is een ander probleem, die headers heb ik alleen genoemd om de context te schetsen.
ty curry684

[ Voor 36% gewijzigd door Verwijderd op 15-04-2004 14:12 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 15 april 2004 @ 14:08:
Die Headers, eindigen met een en vooraf is niet bekend hoeveel headers de user-agent meegeeft.
Dan zoek je inderdaad ongeveer wat [rml]curry684 in "[ c] post defined arguments"[/rml] beschrijft :+

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Je maakt mij niet wijs dat die functie werkt, dus wacht nog maar met bedanken :D

Maar waarom wilde je variabele argumenten? Was je serieus van plan om daar 100 argumenten aan mee te geven omdat een HTTP 1.1 answer soms 100 header fields mee kan sturen? En wilde je dan voor field en value een aparte waarde? :?

Bovendien doet die functie van mij nog geen merge op repeated fields, dat mag je zelf uitvogelen :P

Professionele website nodig?


Verwijderd

Topicstarter
Ik bedank je ook niet omdat de functie werkt (niet eens getest), maar het schept wel nieuwe inzichten tot de benadering van mijn probleem. Dus ik heb er wel wat aan! :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Curry: waarom is HTTPMessage een char **, en waarom is Headers een parameter en geen returnvalue?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op 15 april 2004 @ 14:25:
Curry: waarom is HTTPMessage een char **, en waarom is Headers een parameter en geen returnvalue?
Op deze manier is aan de return-value een error-code te linken.

:X

[ Voor 22% gewijzigd door Verwijderd op 15-04-2004 21:28 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

.oisyn schreef op 15 april 2004 @ 14:25:
Curry: waarom is HTTPMessage een char **
Omdat in het commentaar erboven staat "HttpMessage is set to beginning of body", oftewel aan het begin van het eigenlijke document :)
en waarom is Headers een parameter en geen returnvalue?
Omdat je maar 1 returnvalue in een functie kunt hebben en het aantal gealloceerde headers ook terug moet komen :+
Op deze manier is aan de return-value een error-code te linken.
En lees jij ook even mee:
C:
1
// Returns number of fields read, HttpMessage is set to beginning of body

Deze functie returned geen errors, je kunt hoogstens 0 als een error beschouwen (alhoewel ook dat volgens HTTP 1.0 geldig is geloof ik :) )

[ Voor 27% gewijzigd door curry684 op 15-04-2004 14:46 ]

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Oh die comments zag ik niet omdat ze niet als comments geparsed werden :D

(Is dat een C99 iets, C++-style comments?
ja dus, ik zal de highlighter even aanpassen :)
Mijn highlighter is al goed, ze moeten 'm hier op GoT eens updaten :P)

[ Voor 40% gewijzigd door .oisyn op 15-04-2004 15:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1