Member 12919791 Ответов: 1

Ошибка синтаксического анализа функции C


Вот мой код для функции синтаксического анализа для PSET6. Я не уверен, почему я получаю неудачу 501. (Мне не велено делать это за 404).

~/рабочее место/pset6/ check50 2015$.осень.pset6.сервере server1.с
:) сервер. c существует
:) сервер компилируется
:) HTTP / 1.0 возвращает код ошибки 505
:) Метод 'abcGET' возвращает код ошибки 405
:) Метод 'GETabc' возвращает код ошибки 405
:) request-target без запуска ' / ' возвращает код ошибки 501
:) запрос-цель abc/hello.php возвращает код ошибки 501
: (Запрашивает cat.exe возвращает код ошибки 501
\ ожидаемый вывод, но не "HTTP / 1.1 505 HTTP версия не поддерживается..."
: (Запрос несуществующего файла возвращает код ошибки 404
\ ожидаемый вывод, но не "HTTP / 1.1 505 HTTP версия не поддерживается..."
:) Запрашивающий запрос-цель с " возвращает код ошибки 400
:) Два пробела после GET возвращает код ошибки
:) Пробел в целевом объекте запроса возвращает код ошибки
:) Два пробела перед HTTP / 1.1 возвращает код ошибки
https://sandbox.cs50.net/checks/09d731e26ba744e6b2c086cb1b67cfe5

Что я уже пробовал:

bool parse(const char* line, char* abs_path, char* query)
{   
    char* buffer = malloc(sizeof(line));
    strcpy( buffer, line);
    
    char* firstsp = strtok( buffer, " ");
    char* scndsp = strtok( NULL, " "); 
    char* thirdsp = strtok( NULL, " "); 
    char* ver = strtok( thirdsp, "\\");
    
    char method[ strlen(firstsp) + 1 ];
    char request[ strlen(scndsp) + 1 ];
    char http[ strlen(ver) + 1 ];
    
    strcpy( method, firstsp);
    strcpy( request, scndsp);
    strcpy( http, ver);
    
     if ( strcmp(method, "GET") != 0 )
     {
         error(405);
         return false;
     }

     if ( request[0] != '/')
     {
         error(501);
         return false;
     }
     
    if ( strchr( request, '\"') != NULL )
    {
        error(400);
        return false;
    }
            
    if (strcmp( http, "HTTP/1.1") != 0)
    {
        error(505);
        return false;
    }
    
    abs_path = request;
    
    int b;
    for ( b = 0; b < strlen(scndsp); b++ )
    {
        if ( scndsp[b] == '?' )    
        {
            break;
        }
    }
    
    if ( strchr( scndsp, '=') != NULL)
    {
        while (scndsp[b] != ' ' )
        {
            query[b] = scndsp[b];
            b++;
        }
    }
    else
    {
        query[0] = '\0';
    }
    return true;
}

Afzaal Ahmad Zeeshan

В вашем коде есть эта часть, она говорит, что требует, чтобы запрос начинался с "/". В противном случае он выдаст эту ошибку.

Но непонятно, 501 ошибка обычно означает, что что-то не так (в контексте HTTP-связи). Что именно все это значит?

Member 12919791

Точные инструкции ссылка:

http://cdn.cs50.net/2016/x/psets/6/pset6/pset6.html#parse

1 Ответов

Рейтинг:
2

Jochen Arndt

Есть две большие проблемы с вашим кодом.

char* buffer = malloc(sizeof(line));
strcpy( buffer, line);
line иметь тип char* и sizeof(line) будет, следовательно, размер указателя (4 или 8 байт). Вы наверняка предпочтете
char* buffer = malloc(strlen(line) + 1);


То strtok() звонки возвращаются NULL при последующих вызовах, когда предыдущий токен не был найден (синтаксический анализ останавливался при завершении NULL характер).

Так что ваш scndsp и thirdsp указатель может быть NULL с искаженными строками запросов. Но вы используете эти указатели в качестве аргументов для strtok() (для ver), strlen(), и strcpy(). Все эти функции не проверяли аргументы на то, что они не являются NULL но выполните операцию, используя нулевой адрес.

Если это произойдет, вы набираете случайные символы в request и http строки (байты, содержащиеся по нулевому адресу до тех пор, пока NULL байт).

Так что вы должны проверить NULL сначала указатели и возвращают соответствующие коды ошибок.