123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- // SPDX-License-Identifier: GPL-3.0-or-later
- #include "content_type.h"
- static struct {
- const char *format;
- HTTP_CONTENT_TYPE content_type;
- bool needs_charset;
- const char *options;
- } content_types[] = {
- // primary - preferred during id-to-string conversions
- { .format = "text/html", CT_TEXT_HTML, true },
- { .format = "text/plain", CT_TEXT_PLAIN, true },
- { .format = "text/css", CT_TEXT_CSS, true },
- { .format = "text/yaml", CT_TEXT_YAML, true },
- { .format = "text/xml", CT_TEXT_XML, true },
- { .format = "text/xsl", CT_TEXT_XSL, true },
- { .format = "application/json", CT_APPLICATION_JSON, true },
- { .format = "application/xml", CT_APPLICATION_XML, true },
- { .format = "application/javascript", CT_APPLICATION_X_JAVASCRIPT, true },
- { .format = "application/octet-stream", CT_APPLICATION_OCTET_STREAM, false },
- { .format = "image/svg+xml", CT_IMAGE_SVG_XML, false },
- { .format = "application/x-font-truetype", CT_APPLICATION_X_FONT_TRUETYPE, false },
- { .format = "application/x-font-opentype", CT_APPLICATION_X_FONT_OPENTYPE, false },
- { .format = "application/font-woff", CT_APPLICATION_FONT_WOFF, false },
- { .format = "application/font-woff2", CT_APPLICATION_FONT_WOFF2, false },
- { .format = "application/vnd.ms-fontobject",CT_APPLICATION_VND_MS_FONTOBJ, false },
- { .format = "image/png", CT_IMAGE_PNG, false },
- { .format = "image/jpeg", CT_IMAGE_JPG, false },
- { .format = "image/gif", CT_IMAGE_GIF, false },
- { .format = "image/x-icon", CT_IMAGE_XICON, false },
- { .format = "image/bmp", CT_IMAGE_BMP, false },
- { .format = "image/icns", CT_IMAGE_ICNS, false },
- { .format = "audio/mpeg", CT_AUDIO_MPEG, false },
- { .format = "audio/ogg", CT_AUDIO_OGG, false },
- { .format = "video/mp4", CT_VIDEO_MP4, false },
- { .format = "application/pdf", CT_APPLICATION_PDF, false },
- { .format = "application/zip", CT_APPLICATION_ZIP, false },
- { .format = "image/png", CT_IMAGE_PNG, false },
- // secondary - overlapping with primary
- { .format = "text/plain", CT_PROMETHEUS, false, "version=0.0.4" },
- { .format = "prometheus", CT_PROMETHEUS },
- { .format = "text", CT_TEXT_PLAIN },
- { .format = "txt", CT_TEXT_PLAIN },
- { .format = "json", CT_APPLICATION_JSON },
- { .format = "html", CT_TEXT_HTML },
- { .format = "xml", CT_APPLICATION_XML },
- // terminator
- { .format = NULL, CT_TEXT_PLAIN },
- };
- HTTP_CONTENT_TYPE content_type_string2id(const char *format) {
- if(format && *format) {
- for (int i = 0; content_types[i].format; i++)
- if (strcmp(content_types[i].format, format) == 0)
- return content_types[i].content_type;
- }
- return CT_TEXT_PLAIN;
- }
- const char *content_type_id2string(HTTP_CONTENT_TYPE content_type) {
- for (int i = 0; content_types[i].format; i++)
- if (content_types[i].content_type == content_type)
- return content_types[i].format;
- return "text/plain";
- }
- void http_header_content_type(BUFFER *wb, HTTP_CONTENT_TYPE content_type) {
- buffer_strcat(wb, "Content-Type: ");
- for (int i = 0; content_types[i].format; i++) {
- if (content_types[i].content_type == content_type) {
- buffer_strcat(wb, content_types[i].format);
- if(content_types[i].needs_charset) {
- buffer_strcat(wb, "; charset=utf-8");
- }
- if(content_types[i].options) {
- buffer_strcat(wb, "; ");
- buffer_strcat(wb, content_types[i].options);
- }
- buffer_strcat(wb, "\r\n");
- return;
- }
- }
- buffer_strcat(wb, "text/plain; charset=utf-8\r\n");
- }
|