2016-11-23 2 views
-1

Können Sie nicht einige Hinweise darüber, was genau das geben, übergeben sind die Fehler in CS50 Check server1 und einige Hinweise darauf hingewiesen, wie sie lösen:CS50 pset6 Server Parse-Funktion - CS50-Server 1 check

meine Parse-Funktion wie folgt aussieht :

bool parse(const char* line, char* abs_path, char* query) 

{ 
    // create copy of line 
    char linecopy[strlen(line)+1]; 
    strcpy(linecopy, line); 
    linecopy[strlen(line)] = '\0'; 



int spaces = 0; 
    for (int i = 0, lenght = strlen(line); i < lenght; i++) 
    { 
    if (line[i] == ' ') 
    spaces++; 

    if (spaces > 2) 
    { 
     error(400); 
     return false; 
    } 
    } 
    char* methodcopy; 
    char* targetcopy; 
    char* httpcopy; 

    // extract method, request-target, and http version to tokens 
    methodcopy = strtok(linecopy, " "); 
    targetcopy = strtok(NULL, " "); 
    httpcopy = strtok(NULL, "\r\n"); 

    //copy tokens into method, target and http 

    char method[strlen(methodcopy) + 1]; 
    strcpy (method, methodcopy); 
    char target[strlen(targetcopy) + 1]; 
    strcpy(target, targetcopy); 
    char http[strlen(httpcopy) + 1]; 
    strcpy(http, httpcopy); 

    // add null terminators 

    method[strlen(method)] = '\0'; 
    target[strlen(target)] = '\0'; 
    http[strlen(http)] = '\0'; 

    // ensure method is GET 

    if(strncmp(method, "GET", 4)!= 0) 
    { 
     error(405); 
    } 
    // ensure request-target begins with "/" 
    if(strchr(target, '/') == NULL) 
    { 
     error(501); 

    } 
    // ensure request-target does not contain '"' 
    if (strchr(target, '"') != NULL) 
     { 
      error(400); 
     } 
    // ensure HTTP version is 1.1 
    if(strcmp(http, "HTTP/1.1") != 0) 
    { 
     error(505); 

    } 

    // extract query from request-target 
    char* abs_pathcopy; 
    char* querycopy; 
    abs_pathcopy = strtok(target, "?"); 
    querycopy = strtok(NULL, "\0"); 

    //if query isn't null, copy to query 
    if (querycopy != NULL) 
    { 
     strcpy(abs_path, abs_pathcopy); 
     strcpy(query, querycopy); 

     abs_path[strlen(abs_pathcopy)] = '\0'; 
     query[strlen(querycopy)] = '\0'; 
    } 
    //if query is null, set query to null 
     else 
     { 
      strcpy(abs_path, abs_pathcopy); 
      abs_path[strlen(abs_pathcopy)] = '\0'; 
      query[0] = '\0'; 
     } 
    // ensure absolute path does not contain "?" 
    if(strchr(abs_path, '?') != NULL) 
    { 
     error(400); 

    } 
    // ensure query does not contain '"' 

    if(strchr(abs_path, '"') != NULL) 
    { 
     error(400); 

    } 
    return true; 
} 

Wenn ich das CS50-Check-Server 1, habe ich die folgenden Fehler angezeigt:

:(Anfrage Ziel von abc/hello.php Fehlercode 501 \ erwartete Ausgabe zurückgibt, aber nicht "HTTP/1.1 404 nicht gefunden \ r \ nInhaltstyp: ...“

:(cat.exe Anforderung gibt Fehlercode 501 \ erwartete Ausgabe, kein Exit-Code von 0

:(Zwei Leerzeichen nach GET kehrt Fehlercode \ erwartete Ausgabe, kein Ausgang Code von 0

nach meinem Verständnis ist die Anforderungsleitung nicht gemäß der Definition:

Methode SP Anfrage-Ziel SP HTTP-Version CRLF

aber nicht sicher, wie es zu definieren ... .

Alle Tipps und Hinweise sind willkommen! Ich will keine Lösung, aber nur ein paar Hinweise;)

Danke an alle, die sich die Zeit genommen haben, diese lange Frage zu lesen!

Antwort

0

Ihr Algorithmus nimmt zuerst an, dass die Eingabe, Linie, eine wohlgeformte Anfrage ist, als sie in Stücke zu teilen und dann die geteilten Teile zu prüfen. Wie findest du jetzt delimeter "" (SP) genau an richtigen Stellen und in korrekter Anzahl? Was ist, wenn ich niemals einen SP verwende oder doppelten SP überall verwende?

Kurz gesagt, ich denke nicht, dass Sie strtok() mit einer Zeichenfolge verwenden sollten, die Sie nicht über die Richtigkeit ihrer Form wissen. Analysieren Sie die Eingabe char durch char oder verwenden Sie Funktionen wie strchr(), um das Auftreten von Delimetern selbst zu erkennen.

Bearbeiten auf den Einsatz von strchr():

Das Dokument strchr() ich für strchr verknüpft() sagt: "Gibt einen Zeiger auf das erste Vorkommen von Zeichen in der C-String str.". Also, wenn eine Zeichenfolge wie "eins * zwei * drei * vier \ 0" hat, wobei '*' das Delimeter ist;

char* firstStar =strchr(myString, '*') 

einen Zeiger zurück, die auf den ersten Stern weist,

char* secondStar =strchr(firstStar + 1, '*') 

den zweiten Stern zurück, weil Sie von der First seaching sagte starten. Diese Funktion gibt null zurück, wenn das von Ihnen angegebene Zeichen nicht gefunden werden kann. (Siehe Beispiel bei bestimmtem Link)

Jetzt kann ich mithilfe von strncpy() Funktion zweite Parameter um „zwei“ abrufen, weil ich weiß, wo es beginnt (bei First +1) und wie lange ist es (second - First) Beachten Sie, dass Nachdem Sie strncpy() verwendet haben, sollten Sie den Null-Terminator '\ 0' manuell am Ende der kopierten Zeichenfolge setzen.

+0

@ t.m. - Vielen Dank!Ich folgte Ihrem Rat und bearbeitete meinen Code am Anfang und prüfte die Anzahl der Leerzeichen in der Anforderungszeile und dies löste einen der Fehler (:(Zwei Leerzeichen nach GET gibt den Fehlercode \ erwartete Ausgabe zurück, nicht einen Beendigungscode von 0) Ich habe immer noch die anderen zwei Fehler und außerdem bin ich bei dem Versuch fest, eine Lösung zu finden, wie die Korrektheit der Anforderungsleitung per Definition zu bestimmen ist: Methode SP Ziel SP http \ r \ n ..... – SnezhinaT

+0

auch, ich nicht verstehe die Bedeutung der angegebenen Fehler: :(request-target von abc/hello.php gibt den Fehlercode 501 \ expected output zurück, aber nicht "HTTP/1.1 404 Not Found \ r \ nContent-Type: ..." : (Request cat.exe liefert Fehlercode 501 \ erwartete Ausgabe, nicht ein Exit-Code von 0 die Lösung, die Sie anbieten - mit strchr das Delimeter zu erkennen - nicht sicher, wie Sie es implementieren. Im Allgemeinen denke ich, dass ich lösen kann, wenn ich verstehe, was Fehler bedeuten .... – SnezhinaT

+0

Diese Fehler sind in einer seltsamen Syntax geschrieben :). Ich schätze :(request-target von abc/hello.php gibt den Fehlercode 501 \ expected output zurück, aber nicht "HTTP/1.1 404 Not Found \ r \ nContent-Type: ..." bedeutet Ausgabe für "request-target of abc /hello.php "sollte der Fehlercode 501 sein, aber Ihre Ausgabe war" HTTP/1.1 404 Nicht gefunden \ r \ nContent-Type: ... " –