如何在C中生成HTTP内容类型标头?

所以我正在进行网络分配以在C中生成一个基本的HTTP / 1.0 Web服务器。我已经弄明白了,但其中一个要求是它正确填充了标题中的Content-Type字段,而我似乎无法找到任何方法自动执行此操作。

我已经在使用fstat()来获取文件大小以及上次修改的时间,我注意到它还包含一个“st_objtype”字段,但经过一些研究后看起来这只是AS / 400对象类型(显然不是我需要的)和stat()&lstat()似乎与fstat()基本相同。

在C中是否有任何方法可以自动生成给定文件的HTTP样式文件类型的字符串,或者我只需要制作一个大的类型列表并根据请求的结尾将正确的值插入标题中文件(.txt,.html,.png等)?

我检查的各种文件的Content-Type字段的一些示例:

  • Content-Type: text/html; charset=ISO-8859-1
  • Content-Type: image/png
  • Content-Type: application/x-gzip
  • Content-Type: application/pdf

某些系统包含一个名为/etc/mime.types的文件,其中包含一堆扩展和MIME类型对。

请参阅此文件的文档 。

可能最好的方法是基于扩展的查找表。 给定文件与其关联的单个“类型”的想法是错误的。 至少使用扩展可以让您有一点力量来控制文件内容的解释方式。 例如,如果您想要显示html源如何工作的示例,您可以将example.html重命名为example.html.txt并让客户端将其视为text/plain 。 如果您只是使用启发式方法来确定文件内容“是html”,那么您将被卡住。

一个文件只是一个字节包,所以没有办法确定.html文件不包含C代码。 您可以委托给文件命令 ,该命令包含许多启发式,用于根据文件的前几个字节确定这些类型的东西(例如,脚本以#!开头),但文件仍然不是万无一失的。 我会建议基于文件名的查找表。