gpt4 book ai didi

c - 解析GET请求的url路径

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:13 25 4
gpt4 key购买 nike

我是 C 的新手,现在我已经完成这项任务大约 7 个小时了 - 请不要说我没有尝试过。

我想用C解析一个自己写的webserver的路径,假设我调用

http://localhost:8080/hello/this/is/a/test.html

然后浏览器获取

GET /hello/this/is/a/test.html HTTP/1.1

我想解析/hello/this/is/a/test.html ,因此“GET”(注意 GET 之后的空格)和 /../../..html 之后的第一个空格之间的完整字符串.

到目前为止我尝试了什么:

int main() {
...
char * getPathOfGetRequest(char *);
char *pathname = getPathOfGetRequest(buf);

printf("%s\n\n%s", buf, pathname);
...
}

char * getPathOfGetRequest(char *buf) {

char *startingGet = "GET ";
char buf_cpy[BUFLEN];
memcpy(buf_cpy, buf, sizeof(buf));

char *urlpath = malloc(1000);
char *path = malloc(1000);
urlpath = strstr(buf_cpy, startingGet);

char delimiter[] = " ";

path = strtok(urlpath, delimiter);
path = strtok(NULL, delimiter);

return path;
}

路径名始终只有 4 个正确的字符,可能会或可能不会填充其他不相关的字符,例如 /hell32984cn)/$"§$ .估计跟strlen(startingGet)有关系,但是看不出有什么关系。我的错误在哪里?

最佳答案

带注释的问题代码:

char * getPathOfGetRequest(char *buf) {

char *startingGet = "GET ";
char buf_cpy[BUFLEN];
memcpy(buf_cpy, buf, sizeof(buf));

上面的 memcpy 可能只会从 buf 复制 4 个字节到 buf_cpy。这是因为 buf 是指向 char 的指针。sizeof(buf) 是指针的大小(可能是:4)。或许,与其使用“sizeof()”,不如使用“strlen()”。

  char *urlpath = malloc(1000);
char *path = malloc(1000);

urlpath = strstr(buf_cpy, startingGet);

也许提问者不清楚为什么urlpath被分配了1000字节的内存。在任何情况下,上述分配都会导致这 1000 个字节被泄漏,并且违背了“urlpath=malloc(1000)”的目的。

以上语句的实际效果是urlpath = buf_cpy;,因为strstr()会返回buf_copy中'GET'开始的位置。

  char delimiter[] = " ";

path = strtok(urlpath, delimiter);

同样,上述分配将导致分配给 path 的 1000 字节被泄漏,并且违背了上面 'path=malloc(1000)' 的目的。

  path = strtok(NULL, delimiter); 

return path;
}

替代编码:

char *getPathOfGetRequest(const char *buf) 
{
const char *start = buf;
const char *end;
char *path=NULL;
size_t pathLen;

/* Verify that there is a 'GET ' at the beginning of the string. */
if(strncmp("GET ", start, 4))
{
fprintf(stderr, "Parse error: 'GET ' is missing.\n");
goto CLEANUP;
}

/* Set the start pointer at the first character beyond the 'GET '. */
start += 4;

/* From the start position, set the end pointer to the first white-space character found in the string. */
end=start;
while(*end && !isspace(*end))
++end;

/* Calculate the path length, and allocate sufficient memory for the path plus string termination. */
pathLen = (end - start);
path = malloc(pathLen + 1);
if(NULL == path)
{
fprintf(stderr, "malloc() failed. \n");
goto CLEANUP;
}

/* Copy the path string to the path storage. */
memcpy(path, start, pathLen);

/* Terminate the string. */
path[pathLen] = '\0';

CLEANUP:

/* Return the allocated storage, or NULL in the event of an error, to the caller. */
return(path);
}

最后,如果“strtok()”必须被使用:

char *getPathOfGetRequest(char *buf)
{
char *path = NULL;

if(strtok(buf, " "))
{
path = strtok(NULL, " ");
if(path)
path=strdup(path);
}

return(path);
}

关于c - 解析GET请求的url路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com