123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- // ⚡️ Fiber is an Express inspired web framework written in Go with ☕️
- // 🤖 Github Repository: https://github.com/gofiber/fiber
- // 📌 API Documentation: https://docs.gofiber.io
- package utils
- import (
- "mime"
- "strings"
- )
- const MIMEOctetStream = "application/octet-stream"
- // GetMIME returns the content-type of a file extension
- func GetMIME(extension string) string {
- if len(extension) == 0 {
- return ""
- }
- var foundMime string
- if extension[0] == '.' {
- foundMime = mimeExtensions[extension[1:]]
- } else {
- foundMime = mimeExtensions[extension]
- }
- if len(foundMime) == 0 {
- if extension[0] != '.' {
- foundMime = mime.TypeByExtension("." + extension)
- } else {
- foundMime = mime.TypeByExtension(extension)
- }
- if foundMime == "" {
- return MIMEOctetStream
- }
- }
- return foundMime
- }
- // ParseVendorSpecificContentType check if content type is vendor specific and
- // if it is parsable to any known types. If its not vendor specific then returns
- // the original content type.
- func ParseVendorSpecificContentType(cType string) string {
- plusIndex := strings.Index(cType, "+")
- if plusIndex == -1 {
- return cType
- }
- var parsableType string
- if semiColonIndex := strings.Index(cType, ";"); semiColonIndex == -1 {
- parsableType = cType[plusIndex+1:]
- } else if plusIndex < semiColonIndex {
- parsableType = cType[plusIndex+1 : semiColonIndex]
- } else {
- return cType[:semiColonIndex]
- }
- slashIndex := strings.Index(cType, "/")
- if slashIndex == -1 {
- return cType
- }
- return cType[0:slashIndex+1] + parsableType
- }
- // limits for HTTP statuscodes
- const (
- statusMessageMin = 100
- statusMessageMax = 511
- )
- // StatusMessage returns the correct message for the provided HTTP statuscode
- func StatusMessage(status int) string {
- if status < statusMessageMin || status > statusMessageMax {
- return ""
- }
- return statusMessage[status]
- }
- // NOTE: Keep this in sync with the status code list
- var statusMessage = []string{
- 100: "Continue", // StatusContinue
- 101: "Switching Protocols", // StatusSwitchingProtocols
- 102: "Processing", // StatusProcessing
- 103: "Early Hints", // StatusEarlyHints
- 200: "OK", // StatusOK
- 201: "Created", // StatusCreated
- 202: "Accepted", // StatusAccepted
- 203: "Non-Authoritative Information", // StatusNonAuthoritativeInformation
- 204: "No Content", // StatusNoContent
- 205: "Reset Content", // StatusResetContent
- 206: "Partial Content", // StatusPartialContent
- 207: "Multi-Status", // StatusMultiStatus
- 208: "Already Reported", // StatusAlreadyReported
- 226: "IM Used", // StatusIMUsed
- 300: "Multiple Choices", // StatusMultipleChoices
- 301: "Moved Permanently", // StatusMovedPermanently
- 302: "Found", // StatusFound
- 303: "See Other", // StatusSeeOther
- 304: "Not Modified", // StatusNotModified
- 305: "Use Proxy", // StatusUseProxy
- 306: "Switch Proxy", // StatusSwitchProxy
- 307: "Temporary Redirect", // StatusTemporaryRedirect
- 308: "Permanent Redirect", // StatusPermanentRedirect
- 400: "Bad Request", // StatusBadRequest
- 401: "Unauthorized", // StatusUnauthorized
- 402: "Payment Required", // StatusPaymentRequired
- 403: "Forbidden", // StatusForbidden
- 404: "Not Found", // StatusNotFound
- 405: "Method Not Allowed", // StatusMethodNotAllowed
- 406: "Not Acceptable", // StatusNotAcceptable
- 407: "Proxy Authentication Required", // StatusProxyAuthRequired
- 408: "Request Timeout", // StatusRequestTimeout
- 409: "Conflict", // StatusConflict
- 410: "Gone", // StatusGone
- 411: "Length Required", // StatusLengthRequired
- 412: "Precondition Failed", // StatusPreconditionFailed
- 413: "Request Entity Too Large", // StatusRequestEntityTooLarge
- 414: "Request URI Too Long", // StatusRequestURITooLong
- 415: "Unsupported Media Type", // StatusUnsupportedMediaType
- 416: "Requested Range Not Satisfiable", // StatusRequestedRangeNotSatisfiable
- 417: "Expectation Failed", // StatusExpectationFailed
- 418: "I'm a teapot", // StatusTeapot
- 421: "Misdirected Request", // StatusMisdirectedRequest
- 422: "Unprocessable Entity", // StatusUnprocessableEntity
- 423: "Locked", // StatusLocked
- 424: "Failed Dependency", // StatusFailedDependency
- 425: "Too Early", // StatusTooEarly
- 426: "Upgrade Required", // StatusUpgradeRequired
- 428: "Precondition Required", // StatusPreconditionRequired
- 429: "Too Many Requests", // StatusTooManyRequests
- 431: "Request Header Fields Too Large", // StatusRequestHeaderFieldsTooLarge
- 451: "Unavailable For Legal Reasons", // StatusUnavailableForLegalReasons
- 500: "Internal Server Error", // StatusInternalServerError
- 501: "Not Implemented", // StatusNotImplemented
- 502: "Bad Gateway", // StatusBadGateway
- 503: "Service Unavailable", // StatusServiceUnavailable
- 504: "Gateway Timeout", // StatusGatewayTimeout
- 505: "HTTP Version Not Supported", // StatusHTTPVersionNotSupported
- 506: "Variant Also Negotiates", // StatusVariantAlsoNegotiates
- 507: "Insufficient Storage", // StatusInsufficientStorage
- 508: "Loop Detected", // StatusLoopDetected
- 510: "Not Extended", // StatusNotExtended
- 511: "Network Authentication Required", // StatusNetworkAuthenticationRequired
- }
- // MIME types were copied from https://github.com/nginx/nginx/blob/67d2a9541826ecd5db97d604f23460210fd3e517/conf/mime.types with the following updates:
- // - Use "application/xml" instead of "text/xml" as recommended per https://datatracker.ietf.org/doc/html/rfc7303#section-4.1
- // - Use "text/javascript" instead of "application/javascript" as recommended per https://www.rfc-editor.org/rfc/rfc9239#name-text-javascript
- var mimeExtensions = map[string]string{
- "html": "text/html",
- "htm": "text/html",
- "shtml": "text/html",
- "css": "text/css",
- "xml": "application/xml",
- "gif": "image/gif",
- "jpeg": "image/jpeg",
- "jpg": "image/jpeg",
- "js": "text/javascript",
- "atom": "application/atom+xml",
- "rss": "application/rss+xml",
- "mml": "text/mathml",
- "txt": "text/plain",
- "jad": "text/vnd.sun.j2me.app-descriptor",
- "wml": "text/vnd.wap.wml",
- "htc": "text/x-component",
- "avif": "image/avif",
- "png": "image/png",
- "svg": "image/svg+xml",
- "svgz": "image/svg+xml",
- "tif": "image/tiff",
- "tiff": "image/tiff",
- "wbmp": "image/vnd.wap.wbmp",
- "webp": "image/webp",
- "ico": "image/x-icon",
- "jng": "image/x-jng",
- "bmp": "image/x-ms-bmp",
- "woff": "font/woff",
- "woff2": "font/woff2",
- "jar": "application/java-archive",
- "war": "application/java-archive",
- "ear": "application/java-archive",
- "json": "application/json",
- "hqx": "application/mac-binhex40",
- "doc": "application/msword",
- "pdf": "application/pdf",
- "ps": "application/postscript",
- "eps": "application/postscript",
- "ai": "application/postscript",
- "rtf": "application/rtf",
- "m3u8": "application/vnd.apple.mpegurl",
- "kml": "application/vnd.google-earth.kml+xml",
- "kmz": "application/vnd.google-earth.kmz",
- "xls": "application/vnd.ms-excel",
- "eot": "application/vnd.ms-fontobject",
- "ppt": "application/vnd.ms-powerpoint",
- "odg": "application/vnd.oasis.opendocument.graphics",
- "odp": "application/vnd.oasis.opendocument.presentation",
- "ods": "application/vnd.oasis.opendocument.spreadsheet",
- "odt": "application/vnd.oasis.opendocument.text",
- "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
- "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
- "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
- "wmlc": "application/vnd.wap.wmlc",
- "wasm": "application/wasm",
- "7z": "application/x-7z-compressed",
- "cco": "application/x-cocoa",
- "jardiff": "application/x-java-archive-diff",
- "jnlp": "application/x-java-jnlp-file",
- "run": "application/x-makeself",
- "pl": "application/x-perl",
- "pm": "application/x-perl",
- "prc": "application/x-pilot",
- "pdb": "application/x-pilot",
- "rar": "application/x-rar-compressed",
- "rpm": "application/x-redhat-package-manager",
- "sea": "application/x-sea",
- "swf": "application/x-shockwave-flash",
- "sit": "application/x-stuffit",
- "tcl": "application/x-tcl",
- "tk": "application/x-tcl",
- "der": "application/x-x509-ca-cert",
- "pem": "application/x-x509-ca-cert",
- "crt": "application/x-x509-ca-cert",
- "xpi": "application/x-xpinstall",
- "xhtml": "application/xhtml+xml",
- "xspf": "application/xspf+xml",
- "zip": "application/zip",
- "bin": "application/octet-stream",
- "exe": "application/octet-stream",
- "dll": "application/octet-stream",
- "deb": "application/octet-stream",
- "dmg": "application/octet-stream",
- "iso": "application/octet-stream",
- "img": "application/octet-stream",
- "msi": "application/octet-stream",
- "msp": "application/octet-stream",
- "msm": "application/octet-stream",
- "mid": "audio/midi",
- "midi": "audio/midi",
- "kar": "audio/midi",
- "mp3": "audio/mpeg",
- "ogg": "audio/ogg",
- "m4a": "audio/x-m4a",
- "ra": "audio/x-realaudio",
- "3gpp": "video/3gpp",
- "3gp": "video/3gpp",
- "ts": "video/mp2t",
- "mp4": "video/mp4",
- "mpeg": "video/mpeg",
- "mpg": "video/mpeg",
- "mov": "video/quicktime",
- "webm": "video/webm",
- "flv": "video/x-flv",
- "m4v": "video/x-m4v",
- "mng": "video/x-mng",
- "asx": "video/x-ms-asf",
- "asf": "video/x-ms-asf",
- "wmv": "video/x-ms-wmv",
- "avi": "video/x-msvideo",
- }
|