HTTP GET:发送请求目录

时间:2016-03-02 07:00:48

标签: html c http directory

我正在处理HTTP GET请求,我尝试做的事情如下:

如果请求对应于目录且目录不包含index.html 文件,回复一个HTML页面,其中包含指向该所有直系子项的链接 目录(类似于ls -1),以及父目录的链接。 (链接到 父目录看起来像父目录)

note1:要列出目录的内容,我使用opendir()和readdir()。笔记2: - HTTP中的链接可以使用相对路径或绝对路径。

它不起作用。两个错误示例如下:

FAIL-1获取根目录列表:     我向服务器发送了一个HTTP请求,然后我找回了一些HTML。     我找了一个指向' / test_directory1'的链接,但我找不到它。     (注意:HTML中包含相对路径的链接相对于' /'已解析。)     但是,我找到了一个指向' /test_file.txt'的链接。     如何重现:         我创建了一个空目录,并在其中放入了一个test_file.txt文件和一个test_directory1。         我用.files选项启动了./httpserver。         我向Web服务器发送了一个HTTP请求,以便查看我创建的所有文件。

FAIL-2获取子目录的目录列表:     我向服务器发送了一个HTTP请求,然后我找回了一些HTML。     我找了一个指向' / test_directory1'的链接,但我找不到它。     (注意:相对于' / test_directory1 / test_directory2 /'解析了包含HTML中相对路径的链接。)     但是,我确实找到了' / test_directory1 / test_directory2'的链接。     如何重现:         我创建了一个空目录并在其中放置了一个test_directory1目录。         然后我将test_directory2放在test_directory1中。         然后我用.files选项启动了./httpserver。         我发送了/ test_directory1 / test_directory2的HTTP请求(路径末尾没有斜杠)。         我在test_directory2中查找文件列表,其中应包含指向父目录的链接(/ test_directory1 /)。

/*if is directory but doesn't contain index.html, send links instead*/
  struct dirent *dp;
  http_start_response(fd, 200);
  http_send_header(fd, "Content-Type", "text/html");

  http_end_headers(fd);
  while( (dp = readdir(opendir(fullPath)))!= NULL){

    char * filename = malloc(256+1);
    strcpy(filename, dp -> d_name);
    char * linkString = malloc(256+256+18+1);
    strcpy(linkString, "<<a href=\"");
    strcat(linkString, filename);
    strcat(linkString, "\">");
    strcat(linkString, filename);
    strcat(linkString, "</a></");
    http_send_string(fd, linkString);
    free(filename);

    printf("Is directory but doesn't have index.html, so all links %s\n", linkString);
    free(linkString);

  }

  http_send_string(fd, "<html><a href=\"../\">Parent directory</a><html>");

1 个答案:

答案 0 :(得分:2)

我很遗憾地说这个,但是你的代码在很多层面上看起来都是错误的:

  • 将在每个循环中评估while条件,这意味着您的目录每次都会打开,直到无法打开它为止。

    改为写下:

    if ((dir = opendir (fullPath)) == NULL) {
        //error handling
    }
    while ((dp = readdir (dir)) != NULL) {
        // print tag here
    }
    
  • 您构建的代码错误,输出将是

    <<a href="filename">filename</a>>
    

    我真的不知道在这种情况下不同的浏览器会显示什么

  • 尝试避免动态内存分配,除非需要,并且你不需要它(另外检查malloc结果是否为null,如果malloc因任何原因失败)

    // print each tag
    const char* const filename=dp -> d_name;
    http_send_string( fd, "<a href=\"" ); // start tag open 
    http_send_string( fd, filename ); // attribute value
    http_send_string( fd, "\">" ); // close start tag
    http_send_string( fd, filename ); // tag inner text 
    http_send_string( fd, "</a></br>" ); // closing tag ( with a line break )
    
  • 最好:将链接放在页面顶部的父目录上(即打印循环之前)