2016-11-12 1 views
0

HTTPサーバーのファイルタイプ(コンテンツタイプを使用)をチェックする関数を記述しました。しかし、私はこれをグローバル変数として持っていますが、HTTPとコンテンツタイプの行をブロックしました。ディレクトリから特定のファイルを要求した後、コンテンツタイプのHTTPサーバーに接続するにはどうすればよいですか?

char * request_str; //= "HTTP/1.0 200 OK\r\n" 
     //"Content-type: text/html; charset=UTF-8\r\n\r\n"; 

HTML、PNG、TXT、等これは、引数としてファイル名、ファイルタイプ、およびrequest_strを有するもののようなファイルの種類をチェック機能。私は、ファイル名/ファイルタイプを読んだ後にrequest_strが返ることを期待していますが、動作しないと思います。

void get_filetype(char *filename, char *filetype, char *request_str) 
{ 
    if(strstr(filename, ".html")) 
    { 
     strcpy(filetype, "text/html"); 
     request_str = "HTTP/1.0 200 OK\r\n" 
        "Content-type: text/html; charset=UTF-8\r\n\r\n"; 
     return request_str; 
    } 
else if(strstr(filename, ".gif")) 
{ 
      strcpy(filetype, "image/gif"); 
    request_str = "HTTP/1.0 200 OK\r\n" 
          "Content-type: image/gif; charset=UTF-8\r\n\r\n"; 
    return request_str; 
} 
else if(strstr(filename, ".png")) 
    { 
     strcpy(filetype, "image/png"); 
    request_str = "HTTP/1.0 200 OK\r\n" 
          "Content-type: image/png; charset=UTF-8\r\n\r\n"; 
    return request_str; 
} 
else if(strstr(filename, ".jpg")) 
{ 
      strcpy(filetype, "image/jpg"); 
    request_str = "HTTP/1.0 200 OK\r\n" 
          "Content-type: image/jpg; charset=UTF-8\r\n\r\n"; 
    return request_str; 
} 
else 
{ 
    strcpy(filetype, "text/plain"); 
    request_str = "HTTP/1.0 200 OK\r\n" 
          "Content-type: text/plain; charset=UTF-8\r\n\r\n"; 
    return request_str; 
    } 
} 

サーバに接続しようとすると、この機能がサーバリクエスト機能にあります。私が近づいている問題は、ブラウザーでテストするとWebサーバーに接続しないため、何も表示されないということです。サーバーに接続しようとする前にファイルの種類を確認する必要がありますか?皆さん、事前にありがとうございます。

while(1){ 
    file_offset += recv(client_fd,&client_buf[file_offset],4096,0); 
    if(strstr(client_buf,"\r\n\r\n")) 
     break; 
    } 


requested_file = parseRequest(client_buf); 

    if(stat(filename, &for_filename) < 0) 
    { 
     clienterror(client_fd, filename, "404", "Not found", "Webserver couldn't find this file"); 
     return; 
    } 

    get_filetype(filename, file_type, request_str); 
    send(client_fd,request_str,strlen(request_str),0); 

    // take requested_file, add a . to beginning, open that file 
    filename[0] = '.'; 
    strncpy(&filename[1],requested_file,4095); 
    read_fd = open(filename,0,0); 

答えて

0

アム私は サーバーに接続するためにattemtpting前にファイルの種類を確認することになって?

まず、練習問題でない限り、リクエスト文字列を自分で作成するのではなく、実際にはHTTPクライアントライブラリを使用する必要があります。

第2に、HTTPでは、1回のリクエストで複数の受け入れ可能な形式を指定できます。ブラウザはデフォルト値のリストを使用します。これはhereです。たとえば、Firefoxが要求するデータの種類を事前に知らない場合は、文字列text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8を使用します。ビデオであることが分かっている場合は、別の文字列audio/webm, audio/ogg, audio/wav, audio/*;q=0.9, application/ogg;q=0.7, video/*;q=0.6; */*;q=0.5を使用します。イメージやスクリプトなどの他のタイプのリクエスト文字列が追加されています。

関連する問題