我正在处理一个问题,我无法获得abs_path和查询数组,这些数据填充了我在函数解析中传递给它们的数据。在这个函数逻辑里面似乎是正确的,我调试了它,并且两个数组都填充了正确的数据。我知道由于条件无法更改函数的参数,我没有在参数中传递指向数组(char **)的指针。有关解决这个问题的其他建议吗?
#define LimitRequestLine 8190
char abs_path[LimitRequestLine + 1];
char query[LimitRequestLine + 1];
bool parse(const char* line, char* abs_path, char* query)
{
char* method = "GET ";
char* valid_http = "HTTP/1.1";
int index, method_size;
char abs_path_line[LimitRequestLine + 1];
char query_line[LimitRequestLine + 1];
int abs_path_index;
if(strstr(line, "HTTP/")!=NULL && strstr(line, valid_http) == NULL) {
error(505);
return false;
}
//make sure that our method is GET
for(index = 0, method_size = strlen(method); index<method_size; index++) {
if(line[index] != method[index]) {
error(405);
return false;
}
}
//check if request-target starts with '/'
if(line[index]!='/') {
error(501);
return false;
}
for(abs_path_index = 0; index < strlen(line); index++) {
//if there is a quotation mark, then we have a query in request-target
if(line[index] == '?') {
index++;
int query_index;
for(query_index = 0; line[index]!=' '; index++) {
//check if there is quote mark in query
if(line[index] == '"') {
error(400);
return false;
}
query_line[query_index] = line[index];
query_index++;
}
query_line[query_index] = '\0';
}
//assuming that we have not found any '?' mark for query.
if(strstr(line, "?") == NULL) {
query_line[0] = '\0';
}
if(line[index] == ' ') {
int temp = index;
index++;
/*After the space there should be a valid http, if it is not found,
then there is/are spaces in our request-line which is incorrect*/
for(int i=0; i<strlen(valid_http); i++) {
if(line[index] != valid_http[i]) {
error(400);
return false;
}
index++;
}
index = temp;
break;
}
//check if there is quote mark in abs_path
if(line[index] == '"') {
error(400);
return false;
}
abs_path_line[abs_path_index] += line[index];
abs_path_index++;
}
abs_path_line[abs_path_index] += '\0';
abs_path = abs_path_line;
abs_path += '\0';
query = query_line;
printf("abs path is %s\n", abs_path);
printf("query is %s\n", query);
return true;
}
答案 0 :(得分:1)
问题在于:
query = query_line;
char *query
表示您传递指针。它只是一个像任何其他数字一样的数字。可以这样想。
void set_number(int number) {
number = 6;
}
你期望这样做吗?不。与query = query_line
相同。
相反,query
指向一大块内存。您需要将query_line
复制到query
指向的内存中,并希望有足够的分配空间。
strncpy(query, query_line, LimitRequestLine);
需要调用者分配内存的函数是等待发生的内存问题。我建议不要修理这个......
请注意,函数中的query
与函数外部声明的query
不同。