18.3.9 SHTTPD内容类型的实现

18.3.9  SHTTPD内容类型的实现

内容类型表示服务器支持资源的格式,例如文本格式、超文本格式、流媒体的多种格式等。定义的内容类型格式如下:

 

enum{

    MINET_HTML,    MINET_HTM,    MINET_TXT,    MINET_CSS,    MINET_ICO,    MINET_GIF,    MINET_JPG,    MINET_JPEG,

    MINET_PNG,    MINET_SVG,    MINET_TORRENT,    MINET_WAV,    MINET_MP3,    MINET_MID,    MINET_M3U,    MINET_RAM,

    MINET_RA,    MINET_DOC,    MINET_EXE,    MINET_ZIP,    MINET_XLS,    MINET_TGZ,    MINET_TARGZ,    MINET_TAR,

    MINET_GZ,    MINET_ARJ,    MINET_RAR,    MINET_RTF,    MINET_PDF,    MINET_SWF,    MINET_MPG,    MINET_MPEG,

    MINET_ASF,    MINET_AVI,    MINET_BMP

};

 

结构struct mine_type用于表示文件内容的文件格式,原型如下。其中成员externsion为文件的扩展名,即此类型所可能的文件,例如text/html类型包含扩展名htmlhtm两种类型。成员type表示类型,其类型值为上面所定义的枚举类型变量。成员ext_len表示扩展名的长度,方便安全比较。成员mine_type表示内容的类型,此项为RFC所定义的      类型。

 

struct mine_type{

    char            *extension;      /*扩展名*/

    int                 type;                /*类型*/

    int             ext_len;         /*扩展名长度*/

    char            *mime_type;      /*内容类型*/

}

builtin_mime_types[] = {

    {"html",     MINET_HTML,  4,    "text/html"              },

    {"htm",          MINET_HTM,   3,    "text/html"              },

    {"txt",          MINET_TXT,   3,    "text/plain"         },

    {"css",          MINET_CSS,   3,    "text/css"               },

    {"ico",          MINET_ICO,   3,    "image/x-icon"            },

    {"gif",          MINET_GIF,   3,    "image/gif"              },

    {"jpg",          MINET_JPG,   3,    "image/jpeg"         },

    {"jpeg",     MINET_JPEG,  4,    "image/jpeg"         },

    {"png",          MINET_PNG,   3,    "image/png"              },

    {"svg",          MINET_SVG,   3,    "image/svg+xml"           },

    {"torrent",      MINET_TORRENT,    7,    "application/x-bittorrent" },

    {"wav",          MINET_WAV,   3,    "audio/x-wav"            },

    {"mp3",          MINET_MP3,   3,    "audio/x-mp3"            },

    {"mid",          MINET_MID,   3,    "audio/mid"              },

    {"m3u",          MINET_M3U,   3,    "audio/x-mpegurl"     },

    {"ram",          MINET_RAM,   3,    "audio/x-pn-realaudio"        },

    {"ra",            MINET_RA,    2,    "audio/x-pn-realaudio"        },

    {"doc",          MINET_DOC,   3,    "application/msword",     },

    {"exe",          MINET_EXE,   3,    "application/octet-stream" },

    {"zip",          MINET_ZIP,   3,    "application/x-zip-compressed"    },

    {"xls",          MINET_XLS,   3,    "application/excel"           },

    {"tgz",          MINET_TGZ,   3,    "application/x-tar-gz"        },

    {"tar.gz",       MINET_TARGZ,6,    "application/x-tar-gz"        },

    {"tar",          MINET_TAR,   3,    "application/x-tar"           },

    {"gz",            MINET_GZ,    2,    "application/x-gunzip"        },

    {"arj",          MINET_ARJ,   3,    "application/x-arj-compressed"    },

    {"rar",          MINET_RAR,   3,    "application/x-arj-compressed"    },

    {"rtf",          MINET_RTF,   3,    "application/rtf"     },

    {"pdf",          MINET_PDF,   3,    "application/pdf"     },

    {"swf",          MINET_SWF,   3,    "application/x-shockwave-flash"    },

    {"mpg",          MINET_MPG,   3,    "video/mpeg"         },

    {"mpeg",     MINET_MPEG,  4,    "video/mpeg"         },

    {"asf",          MINET_ASF,   3,    "video/x-ms-asf"      },

    {"avi",          MINET_AVI,   3,    "video/x-msvideo"     },

    {"bmp",          MINET_BMP,   3,    "image/bmp"              },

    {NULL,            -1,         0,    NULL                    }

};

 

函数Mine_Type()根据输入的扩展名查找内容类型中的匹配项。

 

struct mine_type* Mine_Type(char *uri, int len, struct worker_ctl *wctl)

{

    DBGPRINT("==>Mine_Type/n");

    int i = 0;

    char *ext = memchr(uri, '.', len);               /*查找扩展名的位置*/

    struct mine_type *mine = NULL;      

    int found = 0;

    ext++;                                            /*扩展名第一个字节位置*/

    printf("uri:%s,len:%d,ext is %d, %s/n",uri,len,ext, ext);

    for(mine = &builtin_mime_types[i]; mine->extension != NULL; i++)
                                                    /
*在内容类型中找匹配项*/

    {

        if(!strncmp(mine->extension, ext, mine->ext_len))
                                                    /
*比较扩展名*/

        {

            found = 1;

            printf("found it, ext is %s/n",mine->extension);

            break;

        }

    }

    if(!found)                                       /*没有找到的时候,默认类型
                                                     
"text/plain"*/

    {

        mine = &builtin_mime_types[2];

    }  

    DBGPRINT("<==Mine_Type/n");

    return mine;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值