Commit dc5d643b authored by Alexey Sharov's avatar Alexey Sharov Committed by Anton Evangelatov

cmd/swarm, swarm: cross-platform Content-Type detection (#17782)

- Mime types generator (Standard "mime" package rely on system-settings, see mime.osInitMime)
- Changed swarm/api.Upload:
    - simplify I/O throttling by semaphore primitive and use file name where possible
    - f.Close() must be called in Defer - otherwise panic or future added early return will cause leak of file descriptors
    - one error was suppressed
parent b69942be
......@@ -57,6 +57,9 @@ devtools:
@type "solc" 2> /dev/null || echo 'Please install solc'
@type "protoc" 2> /dev/null || echo 'Please install protoc'
swarm-devtools:
env GOBIN= go install ./cmd/swarm/mimegen
# Cross Compilation Targets (xgo)
geth-cross: geth-linux geth-darwin geth-windows geth-android geth-ios
......
// Copyright 2018 The go-ethereum Authors
// This file is part of go-ethereum.
//
// go-ethereum is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// go-ethereum is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
package main
// Standard "mime" package rely on system-settings, see mime.osInitMime
// Swarm will run on many OS/Platform/Docker and must behave similar
// This command generates code to add common mime types based on mime.types file
//
// mime.types file provided by mailcap, which follow https://www.iana.org/assignments/media-types/media-types.xhtml
//
// Get last version of mime.types file by:
// docker run --rm -v $(pwd):/tmp alpine:edge /bin/sh -c "apk add -U mailcap; mv /etc/mime.types /tmp"
import (
"bufio"
"bytes"
"flag"
"html/template"
"io/ioutil"
"strings"
"log"
)
var (
typesFlag = flag.String("types", "", "Input mime.types file")
packageFlag = flag.String("package", "", "Golang package in output file")
outFlag = flag.String("out", "", "Output file name for the generated mime types")
)
type mime struct {
Name string
Exts []string
}
type templateParams struct {
PackageName string
Mimes []mime
}
func main() {
// Parse and ensure all needed inputs are specified
flag.Parse()
if *typesFlag == "" {
log.Fatalf("--types is required")
}
if *packageFlag == "" {
log.Fatalf("--types is required")
}
if *outFlag == "" {
log.Fatalf("--out is required")
}
params := templateParams{
PackageName: *packageFlag,
}
types, err := ioutil.ReadFile(*typesFlag)
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(bytes.NewReader(types))
for scanner.Scan() {
txt := scanner.Text()
if strings.HasPrefix(txt, "#") || len(txt) == 0 {
continue
}
parts := strings.Fields(txt)
if len(parts) == 1 {
continue
}
params.Mimes = append(params.Mimes, mime{parts[0], parts[1:]})
}
if err = scanner.Err(); err != nil {
log.Fatal(err)
}
result := bytes.NewBuffer([]byte{})
if err := template.Must(template.New("_").Parse(tpl)).Execute(result, params); err != nil {
log.Fatal(err)
}
if err := ioutil.WriteFile(*outFlag, result.Bytes(), 0600); err != nil {
log.Fatal(err)
}
}
var tpl = `// Code generated by github.com/ethereum/go-ethereum/cmd/swarm/mimegen. DO NOT EDIT.
package {{ .PackageName }}
import "mime"
func init() {
var mimeTypes = map[string]string{
{{- range .Mimes -}}
{{ $name := .Name -}}
{{- range .Exts }}
".{{ . }}": "{{ $name | html }}",
{{- end }}
{{- end }}
}
for ext, name := range mimeTypes {
if err := mime.AddExtensionType(ext, name); err != nil {
panic(err)
}
}
}
`
# This is a comment. I love comments. -*- indent-tabs-mode: t -*-
# This file controls what Internet media types are sent to the client for
# given file extension(s). Sending the correct media type to the client
# is important so they know how to handle the content of the file.
# Extra types can either be added here or by using an AddType directive
# in your config files. For more information about Internet media types,
# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type
# registry is at <http://www.iana.org/assignments/media-types/>.
# IANA types
# MIME type Extensions
application/1d-interleaved-parityfec
application/3gpdash-qoe-report+xml
application/3gpp-ims+xml
application/A2L a2l
application/activemessage
application/alto-costmap+json
application/alto-costmapfilter+json
application/alto-directory+json
application/alto-endpointcost+json
application/alto-endpointcostparams+json
application/alto-endpointprop+json
application/alto-endpointpropparams+json
application/alto-error+json
application/alto-networkmap+json
application/alto-networkmapfilter+json
application/AML aml
application/andrew-inset ez
application/applefile
application/ATF atf
application/ATFX atfx
application/ATXML atxml
application/atom+xml atom
application/atomcat+xml atomcat
application/atomdeleted+xml atomdeleted
application/atomicmail
application/atomsvc+xml atomsvc
application/auth-policy+xml apxml
application/bacnet-xdd+zip xdd
application/batch-SMTP
application/beep+xml
application/calendar+json
application/calendar+xml xcs
application/call-completion
application/cals-1840
application/cbor cbor
application/ccmp+xml ccmp
application/ccxml+xml ccxml
application/CDFX+XML cdfx
application/cdmi-capability cdmia
application/cdmi-container cdmic
application/cdmi-domain cdmid
application/cdmi-object cdmio
application/cdmi-queue cdmiq
application/cdni
application/CEA cea
application/cea-2018+xml
application/cellml+xml cellml cml
application/cfw
application/clue_info+xml clue
application/cms cmsc
application/cnrp+xml
application/coap-group+json
application/coap-payload
application/commonground
application/conference-info+xml
application/cpl+xml cpl
application/cose
application/cose-key
application/cose-key-set
application/csrattrs csrattrs
application/csta+xml
application/CSTAdata+xml
application/csvm+json
application/cybercash
application/dash+xml mpd
application/dashdelta mpdd
application/davmount+xml davmount
application/dca-rft
application/DCD dcd
application/dec-dx
application/dialog-info+xml
application/dicom dcm
application/dicom+json
application/dicom+xml
application/DII dii
application/DIT dit
application/dns
application/dskpp+xml xmls
application/dssc+der dssc
application/dssc+xml xdssc
application/dvcs dvc
application/ecmascript es
application/EDI-Consent
application/EDI-X12
application/EDIFACT
application/efi efi
application/EmergencyCallData.Comment+xml
application/EmergencyCallData.Control+xml
application/EmergencyCallData.DeviceInfo+xml
application/EmergencyCallData.eCall.MSD
application/EmergencyCallData.ProviderInfo+xml
application/EmergencyCallData.ServiceInfo+xml
application/EmergencyCallData.SubscriberInfo+xml
application/EmergencyCallData.VEDS+xml
application/emma+xml emma
application/emotionml+xml emotionml
application/encaprtp
application/epp+xml
application/epub+zip epub
application/eshop
application/exi exi
application/fastinfoset finf
application/fastsoap
application/fdt+xml fdt
# fits, fit, fts: image/fits
application/fits
# application/font-sfnt deprecated in favor of font/sfnt
application/font-tdpfr pfr
# application/font-woff deprecated in favor of font/woff
application/framework-attributes+xml
application/geo+json geojson
application/geo+json-seq
application/gml+xml gml
application/gzip gz tgz
application/H224
application/held+xml
application/http
application/hyperstudio stk
application/ibe-key-request+xml
application/ibe-pkg-reply+xml
application/ibe-pp-data
application/iges
application/im-iscomposing+xml
application/index
application/index.cmd
application/index.obj
application/index.response
application/index.vnd
application/inkml+xml ink inkml
application/iotp
application/ipfix ipfix
application/ipp
application/isup
application/its+xml its
application/javascript js
application/jose
application/jose+json
application/jrd+json jrd
application/json json
application/json-patch+json json-patch
application/json-seq
application/jwk+json
application/jwk-set+json
application/jwt
application/kpml-request+xml
application/kpml-response+xml
application/ld+json jsonld
application/lgr+xml lgr
application/link-format wlnk
application/load-control+xml
application/lost+xml lostxml
application/lostsync+xml lostsyncxml
application/LXF lxf
application/mac-binhex40 hqx
application/macwriteii
application/mads+xml mads
application/marc mrc
application/marcxml+xml mrcx
application/mathematica nb ma mb
application/mathml-content+xml
application/mathml-presentation+xml
application/mathml+xml mml
application/mbms-associated-procedure-description+xml
application/mbms-deregister+xml
application/mbms-envelope+xml
application/mbms-msk-response+xml
application/mbms-msk+xml
application/mbms-protection-description+xml
application/mbms-reception-report+xml
application/mbms-register-response+xml
application/mbms-register+xml
application/mbms-schedule+xml
application/mbms-user-service-description+xml
application/mbox mbox
application/media_control+xml
# mpf: text/vnd.ms-mediapackage
application/media-policy-dataset+xml
application/mediaservercontrol+xml
application/merge-patch+json
application/metalink4+xml meta4
application/mets+xml mets
application/MF4 mf4
application/mikey
application/mods+xml mods
application/moss-keys
application/moss-signature
application/mosskey-data
application/mosskey-request
application/mp21 m21 mp21
# mp4, mpg4: video/mp4, see RFC 4337
application/mp4
application/mpeg4-generic
application/mpeg4-iod
application/mpeg4-iod-xmt
# xdf: application/xcap-diff+xml
application/mrb-consumer+xml
application/mrb-publish+xml
application/msc-ivr+xml
application/msc-mixer+xml
application/msword doc
application/mud+json
application/mxf mxf
application/n-quads nq
application/n-triples nt
application/nasdata
application/news-checkgroups
application/news-groupinfo
application/news-transmission
application/nlsml+xml
application/nss
application/ocsp-request orq
application/ocsp-response ors
application/octet-stream bin lha lzh exe class so dll img iso
application/oda oda
application/ODX odx
application/oebps-package+xml opf
application/ogg ogx
application/oxps oxps
application/p2p-overlay+xml relo
application/parityfec
# xer: application/xcap-error+xml
application/patch-ops-error+xml
application/pdf pdf
application/PDX pdx
application/pgp-encrypted pgp
application/pgp-keys
application/pgp-signature sig
application/pidf-diff+xml
application/pidf+xml
application/pkcs10 p10
application/pkcs12 p12 pfx
application/pkcs7-mime p7m p7c
application/pkcs7-signature p7s
application/pkcs8 p8
# ac: application/vnd.nokia.n-gage.ac+xml
application/pkix-attr-cert
application/pkix-cert cer
application/pkix-crl crl
application/pkix-pkipath pkipath
application/pkixcmp pki
application/pls+xml pls
application/poc-settings+xml
application/postscript ps eps ai
application/ppsp-tracker+json
application/problem+json
application/problem+xml
application/provenance+xml provx
application/prs.alvestrand.titrax-sheet
application/prs.cww cw cww
application/prs.hpub+zip hpub
application/prs.nprend rnd rct
application/prs.plucker
application/prs.rdf-xml-crypt rdf-crypt
application/prs.xsf+xml xsf
application/pskc+xml pskcxml
application/qsig
application/raptorfec
application/rdap+json
application/rdf+xml rdf
application/reginfo+xml rif
application/relax-ng-compact-syntax rnc
application/remote-printing
application/reputon+json
application/resource-lists-diff+xml rld
application/resource-lists+xml rl
application/rfc+xml rfcxml
application/riscos
application/rlmi+xml
application/rls-services+xml rs
application/rpki-ghostbusters gbr
application/rpki-manifest mft
application/rpki-publication
application/rpki-roa roa
application/rpki-updown
application/rtf rtf
application/rtploopback
application/rtx
application/samlassertion+xml
application/samlmetadata+xml
application/sbml+xml
application/scaip+xml
# scm: application/vnd.lotus-screencam
application/scim+json scim
application/scvp-cv-request scq
application/scvp-cv-response scs
application/scvp-vp-request spq
application/scvp-vp-response spp
application/sdp sdp
application/sep+xml
application/sep-exi
application/session-info
application/set-payment
application/set-payment-initiation
application/set-registration
application/set-registration-initiation
application/sgml
application/sgml-open-catalog soc
application/shf+xml shf
application/sieve siv sieve
application/simple-filter+xml cl
application/simple-message-summary
application/simpleSymbolContainer
application/slate
# application/smil obsoleted by application/smil+xml
application/smil+xml smil smi sml
application/smpte336m
application/soap+fastinfoset
application/soap+xml
application/sparql-query rq
application/sparql-results+xml srx
application/spirits-event+xml
application/sql sql
application/srgs gram
application/srgs+xml grxml
application/sru+xml sru
application/ssml+xml ssml
application/tamp-apex-update tau
application/tamp-apex-update-confirm auc
application/tamp-community-update tcu
application/tamp-community-update-confirm cuc
application/tamp-error ter
application/tamp-sequence-adjust tsa
application/tamp-sequence-adjust-confirm sac
# tsq: application/timestamp-query
application/tamp-status-query
# tsr: application/timestamp-reply
application/tamp-status-response
application/tamp-update tur
application/tamp-update-confirm tuc
application/tei+xml tei teiCorpus odd
application/thraud+xml tfi
application/timestamp-query tsq
application/timestamp-reply tsr
application/timestamped-data tsd
application/trig trig
application/ttml+xml ttml
application/tve-trigger
application/ulpfec
application/urc-grpsheet+xml gsheet
application/urc-ressheet+xml rsheet
application/urc-targetdesc+xml td
application/urc-uisocketdesc+xml uis
application/vcard+json
application/vcard+xml
application/vemmi
application/vnd.3gpp.access-transfer-events+xml
application/vnd.3gpp.bsf+xml
application/vnd.3gpp.mid-call+xml
application/vnd.3gpp.pic-bw-large plb
application/vnd.3gpp.pic-bw-small psb
application/vnd.3gpp.pic-bw-var pvb
application/vnd.3gpp-prose+xml
application/vnd.3gpp-prose-pc3ch+xml
# sms: application/vnd.3gpp2.sms
application/vnd.3gpp.sms
application/vnd.3gpp.sms+xml
application/vnd.3gpp.srvcc-ext+xml
application/vnd.3gpp.SRVCC-info+xml
application/vnd.3gpp.state-and-event-info+xml
application/vnd.3gpp.ussd+xml
application/vnd.3gpp2.bcmcsinfo+xml
application/vnd.3gpp2.sms sms
application/vnd.3gpp2.tcap tcap
application/vnd.3lightssoftware.imagescal imgcal
application/vnd.3M.Post-it-Notes pwn
application/vnd.accpac.simply.aso aso
application/vnd.accpac.simply.imp imp
application/vnd.acucobol acu
application/vnd.acucorp atc acutc
application/vnd.adobe.flash.movie swf
application/vnd.adobe.formscentral.fcdt fcdt
application/vnd.adobe.fxp fxp fxpl
application/vnd.adobe.partial-upload
application/vnd.adobe.xdp+xml xdp
application/vnd.adobe.xfdf xfdf
application/vnd.aether.imp
application/vnd.ah-barcode
application/vnd.ahead.space ahead
application/vnd.airzip.filesecure.azf azf
application/vnd.airzip.filesecure.azs azs
application/vnd.amazon.mobi8-ebook azw3
application/vnd.americandynamics.acc acc
application/vnd.amiga.ami ami
application/vnd.amundsen.maze+xml
application/vnd.anki apkg
application/vnd.anser-web-certificate-issue-initiation cii
# Not in IANA listing, but is on FTP site?
application/vnd.anser-web-funds-transfer-initiation fti
# atx: audio/ATRAC-X
application/vnd.antix.game-component
application/vnd.apache.thrift.binary
application/vnd.apache.thrift.compact
application/vnd.apache.thrift.json
application/vnd.api+json
application/vnd.apothekende.reservation+json
application/vnd.apple.installer+xml dist distz pkg mpkg
# m3u: audio/x-mpegurl for now
application/vnd.apple.mpegurl m3u8
# application/vnd.arastra.swi obsoleted by application/vnd.aristanetworks.swi
application/vnd.aristanetworks.swi swi
application/vnd.artsquare
application/vnd.astraea-software.iota iota
application/vnd.audiograph aep
application/vnd.autopackage package
application/vnd.avistar+xml
application/vnd.balsamiq.bmml+xml bmml
application/vnd.balsamiq.bmpr bmpr
application/vnd.bekitzur-stech+json
application/vnd.bint.med-content
application/vnd.biopax.rdf+xml
application/vnd.blueice.multipass mpm
application/vnd.bluetooth.ep.oob ep
application/vnd.bluetooth.le.oob le
application/vnd.bmi bmi
application/vnd.businessobjects rep
application/vnd.cab-jscript
application/vnd.canon-cpdl
application/vnd.canon-lips
application/vnd.capasystems-pg+json
application/vnd.cendio.thinlinc.clientconf tlclient
application/vnd.century-systems.tcp_stream
application/vnd.chemdraw+xml cdxml
application/vnd.chess-pgn pgn
application/vnd.chipnuts.karaoke-mmd mmd
application/vnd.cinderella cdy
application/vnd.cirpack.isdn-ext
application/vnd.citationstyles.style+xml csl
application/vnd.claymore cla
application/vnd.cloanto.rp9 rp9
application/vnd.clonk.c4group c4g c4d c4f c4p c4u
application/vnd.cluetrust.cartomobile-config c11amc
application/vnd.cluetrust.cartomobile-config-pkg c11amz
application/vnd.coffeescript coffee
application/vnd.collection+json
application/vnd.collection.doc+json
application/vnd.collection.next+json
application/vnd.comicbook+zip cbz
# icc: application/vnd.iccprofile
application/vnd.commerce-battelle ica icf icd ic0 ic1 ic2 ic3 ic4 ic5 ic6 ic7 ic8
application/vnd.commonspace csp cst
application/vnd.contact.cmsg cdbcmsg
application/vnd.coreos.ignition+json ign ignition
application/vnd.cosmocaller cmc
application/vnd.crick.clicker clkx
application/vnd.crick.clicker.keyboard clkk
application/vnd.crick.clicker.palette clkp
application/vnd.crick.clicker.template clkt
application/vnd.crick.clicker.wordbank clkw
application/vnd.criticaltools.wbs+xml wbs
application/vnd.ctc-posml pml
application/vnd.ctct.ws+xml
application/vnd.cups-pdf
application/vnd.cups-postscript
application/vnd.cups-ppd ppd
application/vnd.cups-raster
application/vnd.cups-raw
application/vnd.curl curl
application/vnd.cyan.dean.root+xml
application/vnd.cybank
application/vnd.d2l.coursepackage1p0+zip
application/vnd.dart dart
application/vnd.data-vision.rdz rdz
application/vnd.datapackage+json
application/vnd.dataresource+json
application/vnd.debian.binary-package deb udeb
application/vnd.dece.data uvf uvvf uvd uvvd
application/vnd.dece.ttml+xml uvt uvvt
application/vnd.dece.unspecified uvx uvvx
application/vnd.dece.zip uvz uvvz
application/vnd.denovo.fcselayout-link fe_launch
application/vnd.desmume.movie dsm
application/vnd.dir-bi.plate-dl-nosuffix
application/vnd.dm.delegation+xml
application/vnd.dna dna
application/vnd.document+json docjson
application/vnd.dolby.mobile.1
application/vnd.dolby.mobile.2
application/vnd.doremir.scorecloud-binary-document scld
application/vnd.dpgraph dpg mwc dpgraph
application/vnd.dreamfactory dfac
application/vnd.drive+json
application/vnd.dtg.local
application/vnd.dtg.local.flash fla
application/vnd.dtg.local.html
application/vnd.dvb.ait ait
# class: application/octet-stream
application/vnd.dvb.dvbj
application/vnd.dvb.esgcontainer
application/vnd.dvb.ipdcdftnotifaccess
application/vnd.dvb.ipdcesgaccess
application/vnd.dvb.ipdcesgaccess2
application/vnd.dvb.ipdcesgpdd
application/vnd.dvb.ipdcroaming
application/vnd.dvb.iptv.alfec-base
application/vnd.dvb.iptv.alfec-enhancement
application/vnd.dvb.notif-aggregate-root+xml
application/vnd.dvb.notif-container+xml
application/vnd.dvb.notif-generic+xml
application/vnd.dvb.notif-ia-msglist+xml
application/vnd.dvb.notif-ia-registration-request+xml
application/vnd.dvb.notif-ia-registration-response+xml
application/vnd.dvb.notif-init+xml
# pfr: application/font-tdpfr
application/vnd.dvb.pfr
application/vnd.dvb.service svc
# dxr: application/x-director
application/vnd.dxr
application/vnd.dynageo geo
application/vnd.dzr dzr
application/vnd.easykaraoke.cdgdownload
application/vnd.ecdis-update
application/vnd.ecowin.chart mag
application/vnd.ecowin.filerequest
application/vnd.ecowin.fileupdate
application/vnd.ecowin.series
application/vnd.ecowin.seriesrequest
application/vnd.ecowin.seriesupdate
# img: application/octet-stream
application/vnd.efi-img
# iso: application/octet-stream
application/vnd.efi-iso
application/vnd.enliven nml
application/vnd.enphase.envoy
application/vnd.eprints.data+xml
application/vnd.epson.esf esf
application/vnd.epson.msf msf
application/vnd.epson.quickanime qam
application/vnd.epson.salt slt
application/vnd.epson.ssf ssf
application/vnd.ericsson.quickcall qcall qca
application/vnd.espass-espass+zip espass
application/vnd.eszigno3+xml es3 et3
application/vnd.etsi.aoc+xml
application/vnd.etsi.asic-e+zip asice sce
# scs: application/scvp-cv-response
application/vnd.etsi.asic-s+zip asics
application/vnd.etsi.cug+xml
application/vnd.etsi.iptvcommand+xml
application/vnd.etsi.iptvdiscovery+xml
application/vnd.etsi.iptvprofile+xml
application/vnd.etsi.iptvsad-bc+xml
application/vnd.etsi.iptvsad-cod+xml
application/vnd.etsi.iptvsad-npvr+xml
application/vnd.etsi.iptvservice+xml
application/vnd.etsi.iptvsync+xml
application/vnd.etsi.iptvueprofile+xml
application/vnd.etsi.mcid+xml
application/vnd.etsi.mheg5
application/vnd.etsi.overload-control-policy-dataset+xml
application/vnd.etsi.pstn+xml
application/vnd.etsi.sci+xml
application/vnd.etsi.simservs+xml
application/vnd.etsi.timestamp-token tst
application/vnd.etsi.tsl.der
application/vnd.etsi.tsl+xml
application/vnd.eudora.data
application/vnd.ezpix-album ez2
application/vnd.ezpix-package ez3
application/vnd.f-secure.mobile
application/vnd.fastcopy-disk-image dim
application/vnd.fdf fdf
application/vnd.fdsn.mseed msd mseed
application/vnd.fdsn.seed seed dataless
application/vnd.ffsns
application/vnd.filmit.zfc zfc
# all extensions: application/vnd.hbci
application/vnd.fints
application/vnd.firemonkeys.cloudcell
application/vnd.FloGraphIt gph
application/vnd.fluxtime.clip ftc
application/vnd.font-fontforge-sfd sfd
application/vnd.framemaker fm
application/vnd.frogans.fnc fnc
application/vnd.frogans.ltf ltf
application/vnd.fsc.weblaunch fsc
application/vnd.fujitsu.oasys oas
application/vnd.fujitsu.oasys2 oa2
application/vnd.fujitsu.oasys3 oa3
application/vnd.fujitsu.oasysgp fg5
application/vnd.fujitsu.oasysprs bh2
application/vnd.fujixerox.ART-EX
application/vnd.fujixerox.ART4
application/vnd.fujixerox.ddd ddd
application/vnd.fujixerox.docuworks xdw
application/vnd.fujixerox.docuworks.binder xbd
application/vnd.fujixerox.docuworks.container xct
application/vnd.fujixerox.HBPL
application/vnd.fut-misnet
application/vnd.fuzzysheet fzs
application/vnd.genomatix.tuxedo txd
# application/vnd.geo+json obsoleted by application/geo+json
application/vnd.geocube+xml g3 g³
application/vnd.geogebra.file ggb
application/vnd.geogebra.tool ggt
application/vnd.geometry-explorer gex gre
application/vnd.geonext gxt
application/vnd.geoplan g2w
application/vnd.geospace g3w
# gbr: application/rpki-ghostbusters
application/vnd.gerber
application/vnd.globalplatform.card-content-mgt
application/vnd.globalplatform.card-content-mgt-response
application/vnd.gmx gmx
application/vnd.google-earth.kml+xml kml
application/vnd.google-earth.kmz kmz
application/vnd.gov.sk.e-form+xml
application/vnd.gov.sk.e-form+zip
application/vnd.gov.sk.xmldatacontainer+xml
application/vnd.grafeq gqf gqs
application/vnd.gridmp
application/vnd.groove-account gac
application/vnd.groove-help ghf
application/vnd.groove-identity-message gim
application/vnd.groove-injector grv
application/vnd.groove-tool-message gtm
application/vnd.groove-tool-template tpl
application/vnd.groove-vcard vcg
application/vnd.hal+json
application/vnd.hal+xml hal
application/vnd.HandHeld-Entertainment+xml zmm
application/vnd.hbci hbci hbc kom upa pkd bpd
application/vnd.hc+json
# rep: application/vnd.businessobjects
application/vnd.hcl-bireports
application/vnd.hdt hdt
application/vnd.heroku+json
application/vnd.hhe.lesson-player les
application/vnd.hp-HPGL hpgl
application/vnd.hp-hpid hpi hpid
application/vnd.hp-hps hps
application/vnd.hp-jlyt jlt
application/vnd.hp-PCL pcl
application/vnd.hp-PCLXL
application/vnd.httphone
application/vnd.hydrostatix.sof-data sfd-hdstx
application/vnd.hyperdrive+json
application/vnd.hzn-3d-crossword x3d
application/vnd.ibm.afplinedata
application/vnd.ibm.electronic-media emm
application/vnd.ibm.MiniPay mpy
application/vnd.ibm.modcap list3820 listafp afp pseg3820
application/vnd.ibm.rights-management irm
application/vnd.ibm.secure-container sc
application/vnd.iccprofile icc icm
application/vnd.ieee.1905 1905.1
application/vnd.igloader igl
application/vnd.imagemeter.folder+zip imf
application/vnd.imagemeter.image+zip imi
application/vnd.immervision-ivp ivp
application/vnd.immervision-ivu ivu
application/vnd.ims.imsccv1p1 imscc
application/vnd.ims.imsccv1p2
application/vnd.ims.imsccv1p3
application/vnd.ims.lis.v2.result+json
application/vnd.ims.lti.v2.toolconsumerprofile+json
application/vnd.ims.lti.v2.toolproxy.id+json
application/vnd.ims.lti.v2.toolproxy+json
application/vnd.ims.lti.v2.toolsettings+json
application/vnd.ims.lti.v2.toolsettings.simple+json
application/vnd.informedcontrol.rms+xml
# application/vnd.informix-visionary obsoleted by application/vnd.visionary
application/vnd.infotech.project
application/vnd.infotech.project+xml
application/vnd.innopath.wamp.notification
application/vnd.insors.igm igm
application/vnd.intercon.formnet xpw xpx
application/vnd.intergeo i2g
application/vnd.intertrust.digibox
application/vnd.intertrust.nncp
application/vnd.intu.qbo qbo
application/vnd.intu.qfx qfx
application/vnd.iptc.g2.catalogitem+xml
application/vnd.iptc.g2.conceptitem+xml
application/vnd.iptc.g2.knowledgeitem+xml
application/vnd.iptc.g2.newsitem+xml
application/vnd.iptc.g2.newsmessage+xml
application/vnd.iptc.g2.packageitem+xml
application/vnd.iptc.g2.planningitem+xml
application/vnd.ipunplugged.rcprofile rcprofile
application/vnd.irepository.package+xml irp
application/vnd.is-xpr xpr
application/vnd.isac.fcs fcs
application/vnd.jam jam
application/vnd.japannet-directory-service
application/vnd.japannet-jpnstore-wakeup
application/vnd.japannet-payment-wakeup
application/vnd.japannet-registration
application/vnd.japannet-registration-wakeup
application/vnd.japannet-setstore-wakeup
application/vnd.japannet-verification
application/vnd.japannet-verification-wakeup
application/vnd.jcp.javame.midlet-rms rms
application/vnd.jisp jisp
application/vnd.joost.joda-archive joda
application/vnd.jsk.isdn-ngn
application/vnd.kahootz ktz ktr
application/vnd.kde.karbon karbon
application/vnd.kde.kchart chrt
application/vnd.kde.kformula kfo
application/vnd.kde.kivio flw
application/vnd.kde.kontour kon
application/vnd.kde.kpresenter kpr kpt
application/vnd.kde.kspread ksp
application/vnd.kde.kword kwd kwt
application/vnd.kenameaapp htke
application/vnd.kidspiration kia
application/vnd.Kinar kne knp sdf
application/vnd.koan skp skd skm skt
application/vnd.kodak-descriptor sse
application/vnd.las.las+json lasjson
application/vnd.las.las+xml lasxml
application/vnd.liberty-request+xml
application/vnd.llamagraphics.life-balance.desktop lbd
application/vnd.llamagraphics.life-balance.exchange+xml lbe
application/vnd.lotus-1-2-3 123 wk4 wk3 wk1
application/vnd.lotus-approach apr vew
application/vnd.lotus-freelance prz pre
application/vnd.lotus-notes nsf ntf ndl ns4 ns3 ns2 nsh nsg
application/vnd.lotus-organizer or3 or2 org
application/vnd.lotus-screencam scm
application/vnd.lotus-wordpro lwp sam
application/vnd.macports.portpkg portpkg
application/vnd.mapbox-vector-tile mvt
application/vnd.marlin.drm.actiontoken+xml
application/vnd.marlin.drm.conftoken+xml
application/vnd.marlin.drm.license+xml
application/vnd.marlin.drm.mdcf mdc
application/vnd.mason+json
application/vnd.maxmind.maxmind-db mmdb
application/vnd.mcd mcd
application/vnd.medcalcdata mc1
application/vnd.mediastation.cdkey cdkey
application/vnd.meridian-slingshot
application/vnd.MFER mwf
application/vnd.mfmp mfm
application/vnd.micro+json
application/vnd.micrografx.flo flo
application/vnd.micrografx.igx igx
application/vnd.microsoft.portable-executable
application/vnd.microsoft.windows.thumbnail-cache
application/vnd.miele+json
application/vnd.mif mif
application/vnd.minisoft-hp3000-save
application/vnd.mitsubishi.misty-guard.trustweb
application/vnd.Mobius.DAF daf
application/vnd.Mobius.DIS dis
application/vnd.Mobius.MBK mbk
application/vnd.Mobius.MQY mqy
application/vnd.Mobius.MSL msl
application/vnd.Mobius.PLC plc
application/vnd.Mobius.TXF txf
application/vnd.mophun.application mpn
application/vnd.mophun.certificate mpc
application/vnd.motorola.flexsuite
application/vnd.motorola.flexsuite.adsi
application/vnd.motorola.flexsuite.fis
application/vnd.motorola.flexsuite.gotap
application/vnd.motorola.flexsuite.kmr
application/vnd.motorola.flexsuite.ttc
application/vnd.motorola.flexsuite.wem
application/vnd.motorola.iprm
application/vnd.mozilla.xul+xml xul
application/vnd.ms-3mfdocument 3mf
application/vnd.ms-artgalry cil
application/vnd.ms-asf asf
application/vnd.ms-cab-compressed cab
application/vnd.ms-excel xls xlm xla xlc xlt xlw
application/vnd.ms-excel.template.macroEnabled.12 xltm
application/vnd.ms-excel.addin.macroEnabled.12 xlam
application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb
application/vnd.ms-excel.sheet.macroEnabled.12 xlsm
application/vnd.ms-fontobject eot
application/vnd.ms-htmlhelp chm
application/vnd.ms-ims ims
application/vnd.ms-lrm lrm
application/vnd.ms-office.activeX+xml
application/vnd.ms-officetheme thmx
application/vnd.ms-playready.initiator+xml
application/vnd.ms-powerpoint ppt pps pot
application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam
application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm
application/vnd.ms-powerpoint.slide.macroEnabled.12 sldm
application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm
application/vnd.ms-powerpoint.template.macroEnabled.12 potm
application/vnd.ms-PrintDeviceCapabilities+xml
application/vnd.ms-PrintSchemaTicket+xml
application/vnd.ms-project mpp mpt
application/vnd.ms-tnef tnef tnf
application/vnd.ms-windows.devicepairing
application/vnd.ms-windows.nwprinting.oob
application/vnd.ms-windows.printerpairing
application/vnd.ms-windows.wsd.oob
application/vnd.ms-wmdrm.lic-chlg-req
application/vnd.ms-wmdrm.lic-resp
application/vnd.ms-wmdrm.meter-chlg-req
application/vnd.ms-wmdrm.meter-resp
application/vnd.ms-word.document.macroEnabled.12 docm
application/vnd.ms-word.template.macroEnabled.12 dotm
application/vnd.ms-works wcm wdb wks wps
application/vnd.ms-wpl wpl
application/vnd.ms-xpsdocument xps
application/vnd.msa-disk-image msa
application/vnd.mseq mseq
application/vnd.msign
application/vnd.multiad.creator crtr
application/vnd.multiad.creator.cif cif
application/vnd.music-niff
application/vnd.musician mus
application/vnd.muvee.style msty
application/vnd.mynfc taglet
application/vnd.ncd.control
application/vnd.ncd.reference
application/vnd.nearst.inv+json
application/vnd.nervana entity request bkm kcm
application/vnd.netfpx
# ntf: application/vnd.lotus-notes
application/vnd.nitf nitf
application/vnd.neurolanguage.nlu nlu
application/vnd.nintendo.nitro.rom nds
application/vnd.nintendo.snes.rom sfc smc
application/vnd.noblenet-directory nnd
application/vnd.noblenet-sealer nns
application/vnd.noblenet-web nnw
application/vnd.nokia.catalogs
application/vnd.nokia.conml+wbxml
application/vnd.nokia.conml+xml
application/vnd.nokia.iptv.config+xml
application/vnd.nokia.iSDS-radio-presets
application/vnd.nokia.landmark+wbxml
application/vnd.nokia.landmark+xml
application/vnd.nokia.landmarkcollection+xml
application/vnd.nokia.n-gage.ac+xml ac
application/vnd.nokia.n-gage.data ngdat
application/vnd.nokia.n-gage.symbian.install n-gage
application/vnd.nokia.ncd
application/vnd.nokia.pcd+wbxml
application/vnd.nokia.pcd+xml
application/vnd.nokia.radio-preset rpst
application/vnd.nokia.radio-presets rpss
application/vnd.novadigm.EDM edm
application/vnd.novadigm.EDX edx
application/vnd.novadigm.EXT ext
application/vnd.ntt-local.content-share
application/vnd.ntt-local.file-transfer
application/vnd.ntt-local.ogw_remote-access
application/vnd.ntt-local.sip-ta_remote
application/vnd.ntt-local.sip-ta_tcp_stream
application/vnd.oasis.opendocument.chart odc
application/vnd.oasis.opendocument.chart-template otc
application/vnd.oasis.opendocument.database odb
application/vnd.oasis.opendocument.formula odf
# otf: font/otf
application/vnd.oasis.opendocument.formula-template
application/vnd.oasis.opendocument.graphics odg
application/vnd.oasis.opendocument.graphics-template otg
application/vnd.oasis.opendocument.image odi
application/vnd.oasis.opendocument.image-template oti
application/vnd.oasis.opendocument.presentation odp
application/vnd.oasis.opendocument.presentation-template otp
application/vnd.oasis.opendocument.spreadsheet ods
application/vnd.oasis.opendocument.spreadsheet-template ots
application/vnd.oasis.opendocument.text odt
application/vnd.oasis.opendocument.text-master odm
application/vnd.oasis.opendocument.text-template ott
application/vnd.oasis.opendocument.text-web oth
application/vnd.obn
application/vnd.ocf+cbor
application/vnd.oftn.l10n+json
application/vnd.oipf.contentaccessdownload+xml
application/vnd.oipf.contentaccessstreaming+xml
application/vnd.oipf.cspg-hexbinary
application/vnd.oipf.dae.svg+xml
application/vnd.oipf.dae.xhtml+xml
application/vnd.oipf.mippvcontrolmessage+xml
application/vnd.oipf.pae.gem
application/vnd.oipf.spdiscovery+xml
application/vnd.oipf.spdlist+xml
application/vnd.oipf.ueprofile+xml
application/vnd.olpc-sugar xo
application/vnd.oma.bcast.associated-procedure-parameter+xml
application/vnd.oma.bcast.drm-trigger+xml
application/vnd.oma.bcast.imd+xml
application/vnd.oma.bcast.ltkm
application/vnd.oma.bcast.notification+xml
application/vnd.oma.bcast.provisioningtrigger
application/vnd.oma.bcast.sgboot
application/vnd.oma.bcast.sgdd+xml
application/vnd.oma.bcast.sgdu
application/vnd.oma.bcast.simple-symbol-container
application/vnd.oma.bcast.smartcard-trigger+xml
application/vnd.oma.bcast.sprov+xml
application/vnd.oma.bcast.stkm
application/vnd.oma.cab-address-book+xml
application/vnd.oma.cab-feature-handler+xml
application/vnd.oma.cab-pcc+xml
application/vnd.oma.cab-subs-invite+xml
application/vnd.oma.cab-user-prefs+xml
application/vnd.oma.dcd
application/vnd.oma.dcdc
application/vnd.oma.dd2+xml dd2
application/vnd.oma.drm.risd+xml
application/vnd.oma.group-usage-list+xml
application/vnd.oma.lwm2m+json
application/vnd.oma.lwm2m+tlv
application/vnd.oma.pal+xml
application/vnd.oma.poc.detailed-progress-report+xml
application/vnd.oma.poc.final-report+xml
application/vnd.oma.poc.groups+xml
application/vnd.oma.poc.invocation-descriptor+xml
application/vnd.oma.poc.optimized-progress-report+xml
application/vnd.oma.push
application/vnd.oma.scidm.messages+xml
application/vnd.oma.xcap-directory+xml
application/vnd.oma-scws-config
application/vnd.oma-scws-http-request
application/vnd.oma-scws-http-response
application/vnd.omads-email+xml
application/vnd.omads-file+xml
application/vnd.omads-folder+xml
application/vnd.omaloc-supl-init
application/vnd.onepager tam
application/vnd.onepagertamp tamp
application/vnd.onepagertamx tamx
application/vnd.onepagertat tat
application/vnd.onepagertatp tatp
application/vnd.onepagertatx tatx
application/vnd.openblox.game+xml obgx
application/vnd.openblox.game-binary obg
application/vnd.openeye.oeb oeb
application/vnd.openofficeorg.extension oxt
application/vnd.openstreetmap.data+xml osm
application/vnd.openxmlformats-officedocument.custom-properties+xml
application/vnd.openxmlformats-officedocument.customXmlProperties+xml
application/vnd.openxmlformats-officedocument.drawing+xml
application/vnd.openxmlformats-officedocument.drawingml.chart+xml
application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml
application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml
application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml
application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml
application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml
application/vnd.openxmlformats-officedocument.extended-properties+xml
application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml
application/vnd.openxmlformats-officedocument.presentationml.comments+xml
application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml
application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml
application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml
application/vnd.openxmlformats-officedocument.presentationml.presProps+xml
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml
application/vnd.openxmlformats-officedocument.presentationml.slide sldx
application/vnd.openxmlformats-officedocument.presentationml.slide+xml
application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml
application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml
application/vnd.openxmlformats-officedocument.presentationml.slideUpdateInfo+xml
application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml
application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml
application/vnd.openxmlformats-officedocument.presentationml.tags+xml
application/vnd.openxmlformats-officedocument.presentationml.template potx
application/vnd.openxmlformats-officedocument.presentationml.template.main+xml
application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml
application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml
application/vnd.openxmlformats-officedocument.theme+xml
application/vnd.openxmlformats-officedocument.themeOverride+xml
application/vnd.openxmlformats-officedocument.vmlDrawing
application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml
application/vnd.openxmlformats-package.core-properties+xml
application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml
application/vnd.openxmlformats-package.relationships+xml
application/vnd.oracle.resource+json
application/vnd.orange.indata
application/vnd.osa.netdeploy ndc
application/vnd.osgeo.mapguide.package mgp
# jar: application/x-java-archive
application/vnd.osgi.bundle
application/vnd.osgi.dp dp
application/vnd.osgi.subsystem esa
application/vnd.otps.ct-kip+xml
application/vnd.oxli.countgraph oxlicg
application/vnd.pagerduty+json
application/vnd.palm prc pdb pqa oprc
application/vnd.panoply plp
application/vnd.paos+xml
application/vnd.pawaafile paw
application/vnd.pcos
application/vnd.pg.format str
application/vnd.pg.osasli ei6
application/vnd.piaccess.application-license pil
application/vnd.picsel efif
application/vnd.pmi.widget wg
application/vnd.poc.group-advertisement+xml
application/vnd.pocketlearn plf
application/vnd.powerbuilder6 pbd
application/vnd.powerbuilder6-s
application/vnd.powerbuilder7
application/vnd.powerbuilder7-s
application/vnd.powerbuilder75
application/vnd.powerbuilder75-s
application/vnd.preminet preminet
application/vnd.previewsystems.box box vbox
application/vnd.proteus.magazine mgz
application/vnd.publishare-delta-tree qps
# pti: image/prs.pti
application/vnd.pvi.ptid1 ptid
application/vnd.pwg-multiplexed
application/vnd.pwg-xhtml-print+xml
application/vnd.qualcomm.brew-app-res bar
application/vnd.quarantainenet
application/vnd.Quark.QuarkXPress qxd qxt qwd qwt qxl qxb
application/vnd.quobject-quoxdocument quox quiz
application/vnd.radisys.moml+xml
application/vnd.radisys.msml-audit-conf+xml
application/vnd.radisys.msml-audit-conn+xml
application/vnd.radisys.msml-audit-dialog+xml
application/vnd.radisys.msml-audit-stream+xml
application/vnd.radisys.msml-audit+xml
application/vnd.radisys.msml-conf+xml
application/vnd.radisys.msml-dialog-base+xml
application/vnd.radisys.msml-dialog-fax-detect+xml
application/vnd.radisys.msml-dialog-fax-sendrecv+xml
application/vnd.radisys.msml-dialog-group+xml
application/vnd.radisys.msml-dialog-speech+xml
application/vnd.radisys.msml-dialog-transform+xml
application/vnd.radisys.msml-dialog+xml
application/vnd.radisys.msml+xml
application/vnd.rainstor.data tree
application/vnd.rapid
application/vnd.rar rar
application/vnd.realvnc.bed bed
application/vnd.recordare.musicxml mxl
application/vnd.recordare.musicxml+xml
application/vnd.RenLearn.rlprint
application/vnd.rig.cryptonote cryptonote
application/vnd.route66.link66+xml link66
# gbr: application/rpki-ghostbusters
application/vnd.rs-274x
application/vnd.ruckus.download
application/vnd.s3sms
application/vnd.sailingtracker.track st
application/vnd.sbm.cid
application/vnd.sbm.mid2
application/vnd.scribus scd sla slaz
application/vnd.sealed.3df s3df
application/vnd.sealed.csf scsf
application/vnd.sealed.doc sdoc sdo s1w
application/vnd.sealed.eml seml sem
application/vnd.sealed.mht smht smh
application/vnd.sealed.net
# spp: application/scvp-vp-response
application/vnd.sealed.ppt sppt s1p
application/vnd.sealed.tiff stif
application/vnd.sealed.xls sxls sxl s1e
# stm: audio/x-stm
application/vnd.sealedmedia.softseal.html stml s1h
application/vnd.sealedmedia.softseal.pdf spdf spd s1a
application/vnd.seemail see
application/vnd.sema sema
application/vnd.semd semd
application/vnd.semf semf
application/vnd.shana.informed.formdata ifm
application/vnd.shana.informed.formtemplate itp
application/vnd.shana.informed.interchange iif
application/vnd.shana.informed.package ipk
application/vnd.SimTech-MindMapper twd twds
application/vnd.siren+json
application/vnd.smaf mmf
application/vnd.smart.notebook notebook
application/vnd.smart.teacher teacher
application/vnd.software602.filler.form+xml fo
application/vnd.software602.filler.form-xml-zip zfo
application/vnd.solent.sdkm+xml sdkm sdkd
application/vnd.spotfire.dxp dxp
application/vnd.spotfire.sfs sfs
application/vnd.sss-cod
application/vnd.sss-dtf
application/vnd.sss-ntf
application/vnd.stepmania.package smzip
application/vnd.stepmania.stepchart sm
application/vnd.street-stream
application/vnd.sun.wadl+xml wadl
application/vnd.sus-calendar sus susp
application/vnd.svd
application/vnd.swiftview-ics
application/vnd.syncml+xml xsm
application/vnd.syncml.dm+wbxml bdm
application/vnd.syncml.dm+xml xdm
application/vnd.syncml.dm.notification
application/vnd.syncml.dmddf+wbxml
application/vnd.syncml.dmddf+xml ddf
application/vnd.syncml.dmtnds+wbxml
application/vnd.syncml.dmtnds+xml
application/vnd.syncml.ds.notification
application/vnd.tableschema+json
application/vnd.tao.intent-module-archive tao
application/vnd.tcpdump.pcap pcap cap dmp
application/vnd.theqvd qvd
application/vnd.tmd.mediaflex.api+xml
application/vnd.tml vfr viaframe
application/vnd.tmobile-livetv tmo
application/vnd.tri.onesource
application/vnd.trid.tpt tpt
application/vnd.triscape.mxs mxs
application/vnd.trueapp tra
application/vnd.truedoc
# cab: application/vnd.ms-cab-compressed
application/vnd.ubisoft.webplayer
application/vnd.ufdl ufdl ufd frm
application/vnd.uiq.theme utz
application/vnd.umajin umj
application/vnd.unity unityweb
application/vnd.uoml+xml uoml uo
application/vnd.uplanet.alert
application/vnd.uplanet.alert-wbxml
application/vnd.uplanet.bearer-choice
application/vnd.uplanet.bearer-choice-wbxml
application/vnd.uplanet.cacheop
application/vnd.uplanet.cacheop-wbxml
application/vnd.uplanet.channel
application/vnd.uplanet.channel-wbxml
application/vnd.uplanet.list
application/vnd.uplanet.list-wbxml
application/vnd.uplanet.listcmd
application/vnd.uplanet.listcmd-wbxml
application/vnd.uplanet.signal
application/vnd.uri-map urim urimap
application/vnd.valve.source.material vmt
application/vnd.vcx vcx
# sxi: application/vnd.sun.xml.impress
application/vnd.vd-study mxi study-inter model-inter
# mcd: application/vnd.mcd
application/vnd.vectorworks vwx
application/vnd.vel+json
application/vnd.verimatrix.vcas
application/vnd.vidsoft.vidconference vsc
application/vnd.visio vsd vst vsw vss
application/vnd.visionary vis
# vsc: application/vnd.vidsoft.vidconference
application/vnd.vividence.scriptfile
application/vnd.vsf vsf
application/vnd.wap.sic sic
application/vnd.wap.slc slc
application/vnd.wap.wbxml wbxml
application/vnd.wap.wmlc wmlc
application/vnd.wap.wmlscriptc wmlsc
application/vnd.webturbo wtb
application/vnd.wfa.p2p p2p
application/vnd.wfa.wsc wsc
application/vnd.windows.devicepairing
application/vnd.wmc wmc
application/vnd.wmf.bootstrap
# nb: application/mathematica for now
application/vnd.wolfram.mathematica
application/vnd.wolfram.mathematica.package m
application/vnd.wolfram.player nbp
application/vnd.wordperfect wpd
application/vnd.wqd wqd
application/vnd.wrq-hp3000-labelled
application/vnd.wt.stf stf
application/vnd.wv.csp+xml
application/vnd.wv.csp+wbxml wv
application/vnd.wv.ssp+xml
application/vnd.xacml+json
application/vnd.xara xar
application/vnd.xfdl xfdl xfd
application/vnd.xfdl.webform
application/vnd.xmi+xml
application/vnd.xmpie.cpkg cpkg
application/vnd.xmpie.dpkg dpkg
# dpkg: application/vnd.xmpie.dpkg
application/vnd.xmpie.plan
application/vnd.xmpie.ppkg ppkg
application/vnd.xmpie.xlim xlim
application/vnd.yamaha.hv-dic hvd
application/vnd.yamaha.hv-script hvs
application/vnd.yamaha.hv-voice hvp
application/vnd.yamaha.openscoreformat osf
application/vnd.yamaha.openscoreformat.osfpvg+xml
application/vnd.yamaha.remote-setup
application/vnd.yamaha.smaf-audio saf
application/vnd.yamaha.smaf-phrase spf
application/vnd.yamaha.through-ngn
application/vnd.yamaha.tunnel-udpencap
application/vnd.yaoweme yme
application/vnd.yellowriver-custom-menu cmp
application/vnd.zul zir zirz
application/vnd.zzazz.deck+xml zaz
application/voicexml+xml vxml
application/vq-rtcp-xr
application/watcherinfo+xml wif
application/whoispp-query
application/whoispp-response
application/widget wgt
application/wita
application/wordperfect5.1
application/wsdl+xml wsdl
application/wspolicy+xml wspolicy
# yes, this *is* IANA registered despite of x-
application/x-www-form-urlencoded
application/x400-bp
application/xacml+xml
application/xcap-att+xml xav
application/xcap-caps+xml xca
application/xcap-diff+xml xdf
application/xcap-el+xml xel
application/xcap-error+xml xer
application/xcap-ns+xml xns
application/xcon-conference-info-diff+xml
application/xcon-conference-info+xml
application/xenc+xml
application/xhtml+xml xhtml xhtm xht
# xml, xsd, rng: text/xml
application/xml
# mod: audio/x-mod
application/xml-dtd dtd
# ent: text/xml-external-parsed-entity
application/xml-external-parsed-entity
application/xml-patch+xml
application/xmpp+xml
application/xop+xml xop
application/xslt+xml xsl xslt
application/xv+xml mxml xhvml xvml xvm
application/yang yang
application/yang-data+json
application/yang-data+xml
application/yang-patch+json
application/yang-patch+xml
application/yin+xml yin
application/zip zip
application/zlib
audio/1d-interleaved-parityfec
audio/32kadpcm 726
# 3gp, 3gpp: video/3gpp
audio/3gpp
# 3g2, 3gpp2: video/3gpp2
audio/3gpp2
audio/ac3 ac3
audio/AMR amr
audio/AMR-WB awb
audio/amr-wb+
audio/aptx
audio/asc acn
# aa3, omg: audio/ATRAC3
audio/ATRAC-ADVANCED-LOSSLESS aal
# aa3, omg: audio/ATRAC3
audio/ATRAC-X atx
audio/ATRAC3 at3 aa3 omg
audio/basic au snd
audio/BV16
audio/BV32
audio/clearmode
audio/CN
audio/DAT12
audio/dls dls
audio/dsr-es201108
audio/dsr-es202050
audio/dsr-es202211
audio/dsr-es202212
audio/DV
audio/DVI4
audio/eac3
audio/encaprtp
audio/EVRC evc
# qcp: audio/qcelp
audio/EVRC-QCP
audio/EVRC0
audio/EVRC1
audio/EVRCB evb
audio/EVRCB0
audio/EVRCB1
audio/EVRCNW enw
audio/EVRCNW0
audio/EVRCNW1
audio/EVRCWB evw
audio/EVRCWB0
audio/EVRCWB1
audio/EVS
audio/example
audio/fwdred
audio/G711-0
audio/G719
audio/G722
audio/G7221
audio/G723
audio/G726-16
audio/G726-24
audio/G726-32
audio/G726-40
audio/G728
audio/G729
audio/G7291
audio/G729D
audio/G729E
audio/GSM
audio/GSM-EFR
audio/GSM-HR-08
audio/iLBC lbc
audio/ip-mr_v2.5
# wav: audio/x-wav
audio/L16 l16
audio/L20
audio/L24
audio/L8
audio/LPC
audio/MELP
audio/MELP600
audio/MELP1200
audio/MELP2400
audio/mobile-xmf mxmf
# mp4, mpg4: video/mp4, see RFC 4337
audio/mp4 m4a
audio/MP4A-LATM
audio/MPA
audio/mpa-robust
audio/mpeg mp3 mpga mp1 mp2
audio/mpeg4-generic
audio/ogg oga ogg opus spx
audio/opus
audio/parityfec
audio/PCMA
audio/PCMA-WB
audio/PCMU
audio/PCMU-WB
audio/prs.sid sid psid
audio/qcelp qcp
audio/raptorfec
audio/RED
audio/rtp-enc-aescm128
audio/rtp-midi
audio/rtploopback
audio/rtx
audio/SMV smv
# qcp: audio/qcelp, see RFC 3625
audio/SMV-QCP
audio/SMV0
# mid: audio/midi
audio/sp-midi
audio/speex
audio/t140c
audio/t38
audio/telephone-event
audio/tone
audio/UEMCLIP
audio/ulpfec
audio/VDVI
audio/VMR-WB
audio/vnd.3gpp.iufp
audio/vnd.4SB
audio/vnd.audikoz koz
audio/vnd.CELP
audio/vnd.cisco.nse
audio/vnd.cmles.radio-events
audio/vnd.cns.anp1
audio/vnd.cns.inf1
audio/vnd.dece.audio uva uvva
audio/vnd.digital-winds eol
audio/vnd.dlna.adts
audio/vnd.dolby.heaac.1
audio/vnd.dolby.heaac.2
audio/vnd.dolby.mlp mlp
audio/vnd.dolby.mps
audio/vnd.dolby.pl2
audio/vnd.dolby.pl2x
audio/vnd.dolby.pl2z
audio/vnd.dolby.pulse.1
audio/vnd.dra
# wav: audio/x-wav, cpt: application/mac-compactpro
audio/vnd.dts dts
audio/vnd.dts.hd dtshd
# dvb: video/vnd.dvb.file
audio/vnd.dvb.file
audio/vnd.everad.plj plj
# rm: audio/x-pn-realaudio
audio/vnd.hns.audio
audio/vnd.lucent.voice lvp
audio/vnd.ms-playready.media.pya pya
# mxmf: audio/mobile-xmf
audio/vnd.nokia.mobile-xmf
audio/vnd.nortel.vbk vbk
audio/vnd.nuera.ecelp4800 ecelp4800
audio/vnd.nuera.ecelp7470 ecelp7470
audio/vnd.nuera.ecelp9600 ecelp9600
audio/vnd.octel.sbc
# audio/vnd.qcelp deprecated in favour of audio/qcelp
audio/vnd.rhetorex.32kadpcm
audio/vnd.rip rip
audio/vnd.sealedmedia.softseal.mpeg smp3 smp s1m
audio/vnd.vmx.cvsd
audio/vorbis
audio/vorbis-config
font/collection ttc
font/otf otf
font/sfnt
font/ttf ttf
font/woff woff
font/woff2 woff2
image/bmp bmp dib
image/cgm cgm
image/dicom-rle drle
image/emf emf
image/example
image/fits fits fit fts
image/g3fax
image/gif gif
image/ief ief
image/jls jls
image/jp2 jp2 jpg2
image/jpeg jpg jpeg jpe jfif
image/jpm jpm jpgm
image/jpx jpx jpf
image/ktx ktx
image/naplps
image/png png
image/prs.btif btif btf
image/prs.pti pti
image/pwg-raster
image/svg+xml svg svgz
image/t38 t38
image/tiff tiff tif
image/tiff-fx tfx
image/vnd.adobe.photoshop psd
image/vnd.airzip.accelerator.azv azv
image/vnd.cns.inf2
image/vnd.dece.graphic uvi uvvi uvg uvvg
image/vnd.djvu djvu djv
# sub: text/vnd.dvb.subtitle
image/vnd.dvb.subtitle
image/vnd.dwg dwg
image/vnd.dxf dxf
image/vnd.fastbidsheet fbs
image/vnd.fpx fpx
image/vnd.fst fst
image/vnd.fujixerox.edmics-mmr mmr
image/vnd.fujixerox.edmics-rlc rlc
image/vnd.globalgraphics.pgb pgb
image/vnd.microsoft.icon ico
image/vnd.mix
image/vnd.mozilla.apng apng
image/vnd.ms-modi mdi
image/vnd.net-fpx
image/vnd.radiance hdr rgbe xyze
image/vnd.sealed.png spng spn s1n
image/vnd.sealedmedia.softseal.gif sgif sgi s1g
image/vnd.sealedmedia.softseal.jpg sjpg sjp s1j
image/vnd.svf
image/vnd.tencent.tap tap
image/vnd.valve.source.texture vtf
image/vnd.wap.wbmp wbmp
image/vnd.xiff xif
image/vnd.zbrush.pcx pcx
image/wmf wmf
message/CPIM
message/delivery-status
message/disposition-notification
message/example
message/external-body
message/feedback-report
message/global u8msg
message/global-delivery-status u8dsn
message/global-disposition-notification u8mdn
message/global-headers u8hdr
message/http
# cl: application/simple-filter+xml
message/imdn+xml
# message/news obsoleted by message/rfc822
message/partial
message/rfc822 eml mail art
message/s-http
message/sip
message/sipfrag
message/tracking-status
message/vnd.si.simp
# wsc: application/vnd.wfa.wsc
message/vnd.wfa.wsc
model/example
model/gltf+json gltf
model/iges igs iges
model/mesh msh mesh silo
model/vnd.collada+xml dae
model/vnd.dwf dwf
# 3dml, 3dm: text/vnd.in3d.3dml
model/vnd.flatland.3dml
model/vnd.gdl gdl gsm win dor lmp rsm msm ism
model/vnd.gs-gdl
model/vnd.gtw gtw
model/vnd.moml+xml moml
model/vnd.mts mts
model/vnd.opengex ogex
model/vnd.parasolid.transmit.binary x_b xmt_bin
model/vnd.parasolid.transmit.text x_t xmt_txt
model/vnd.rosette.annotated-data-model
model/vnd.valve.source.compiled-map bsp
model/vnd.vtu vtu
model/vrml wrl vrml
# x3db: model/x3d+xml
model/x3d+fastinfoset
# x3d: application/vnd.hzn-3d-crossword
model/x3d+xml x3db
model/x3d-vrml x3dv x3dvz
multipart/alternative
multipart/appledouble
multipart/byteranges
multipart/digest
multipart/encrypted
multipart/form-data
multipart/header-set
multipart/mixed
multipart/parallel
multipart/related
multipart/report
multipart/signed
multipart/vnd.bint.med-plus bmed
multipart/voice-message vpm
multipart/x-mixed-replace
text/1d-interleaved-parityfec
text/cache-manifest appcache manifest
text/calendar ics ifb
text/css css
text/csv csv
text/csv-schema csvs
text/directory
text/dns soa zone
text/encaprtp
# text/ecmascript obsoleted by application/ecmascript
text/enriched
text/example
text/fwdred
text/grammar-ref-list
text/html html htm
# text/javascript obsoleted by application/javascript
text/jcr-cnd cnd
text/markdown markdown md
text/mizar miz
text/n3 n3
text/parameters
text/parityfec
text/plain txt asc text pm el c h cc hh cxx hxx f90 conf log
text/provenance-notation provn
text/prs.fallenstein.rst rst
text/prs.lines.tag tag dsc
text/prs.prop.logic
text/raptorfec
text/RED
text/rfc822-headers
text/richtext rtx
# rtf: application/rtf
text/rtf
text/rtp-enc-aescm128
text/rtploopback
text/rtx
text/sgml sgml sgm
text/strings
text/t140
text/tab-separated-values tsv
text/troff t tr roff
text/turtle ttl
text/ulpfec
text/uri-list uris uri
text/vcard vcf vcard
text/vnd.a a
text/vnd.abc abc
text/vnd.ascii-art ascii
# curl: application/vnd.curl
text/vnd.curl
text/vnd.debian.copyright copyright
text/vnd.DMClientScript dms
text/vnd.dvb.subtitle sub
text/vnd.esmertec.theme-descriptor jtd
text/vnd.fly fly
text/vnd.fmi.flexstor flx
text/vnd.graphviz gv dot
text/vnd.in3d.3dml 3dml 3dm
text/vnd.in3d.spot spot spo
text/vnd.IPTC.NewsML
text/vnd.IPTC.NITF
text/vnd.latex-z
text/vnd.motorola.reflex
text/vnd.ms-mediapackage mpf
text/vnd.net2phone.commcenter.command ccc
text/vnd.radisys.msml-basic-layout
text/vnd.si.uricatalogue uric
text/vnd.sun.j2me.app-descriptor jad
text/vnd.trolltech.linguist ts
text/vnd.wap.si si
text/vnd.wap.sl sl
text/vnd.wap.wml wml
text/vnd.wap.wmlscript wmls
text/xml xml xsd rng
text/xml-external-parsed-entity ent
video/1d-interleaved-parityfec
video/3gpp 3gp 3gpp
video/3gpp2 3g2 3gpp2
video/3gpp-tt
video/BMPEG
video/BT656
video/CelB
video/DV
video/encaprtp
video/example
video/H261
video/H263
video/H263-1998
video/H263-2000
video/H264
video/H264-RCDO
video/H264-SVC
video/H265
video/iso.segment m4s
video/JPEG
video/jpeg2000
video/mj2 mj2 mjp2
video/MP1S
video/MP2P
video/MP2T
video/mp4 mp4 mpg4 m4v
video/MP4V-ES
video/mpeg mpeg mpg mpe m1v m2v
video/mpeg4-generic
video/MPV
video/nv
video/ogg ogv
video/parityfec
video/pointer
video/quicktime mov qt
video/raptorfec
video/raw
video/rtp-enc-aescm128
video/rtploopback
video/rtx
video/SMPTE292M
video/ulpfec
video/vc1
video/vnd.CCTV
video/vnd.dece.hd uvh uvvh
video/vnd.dece.mobile uvm uvvm
video/vnd.dece.mp4 uvu uvvu
video/vnd.dece.pd uvp uvvp
video/vnd.dece.sd uvs uvvs
video/vnd.dece.video uvv uvvv
video/vnd.directv.mpeg
video/vnd.directv.mpeg-tts
video/vnd.dlna.mpeg-tts
video/vnd.dvb.file dvb
video/vnd.fvt fvt
# rm: audio/x-pn-realaudio
video/vnd.hns.video
video/vnd.iptvforum.1dparityfec-1010
video/vnd.iptvforum.1dparityfec-2005
video/vnd.iptvforum.2dparityfec-1010
video/vnd.iptvforum.2dparityfec-2005
video/vnd.iptvforum.ttsavc
video/vnd.iptvforum.ttsmpeg2
video/vnd.motorola.video
video/vnd.motorola.videop
video/vnd.mpegurl mxu m4u
video/vnd.ms-playready.media.pyv pyv
video/vnd.nokia.interleaved-multimedia nim
video/vnd.nokia.videovoip
# mp4: video/mp4
video/vnd.objectvideo
video/vnd.radgamettools.bink bik bk2
video/vnd.radgamettools.smacker smk
video/vnd.sealed.mpeg1 smpg s11
# smpg: video/vnd.sealed.mpeg1
video/vnd.sealed.mpeg4 s14
video/vnd.sealed.swf sswf ssw
video/vnd.sealedmedia.softseal.mov smov smo s1q
# uvu, uvvu: video/vnd.dece.mp4
video/vnd.uvvu.mp4
video/vnd.vivo viv
video/VP8
# Non-IANA types
application/mac-compactpro cpt
application/metalink+xml metalink
application/owl+xml owx
application/rss+xml rss
application/vnd.android.package-archive apk
application/vnd.oma.dd+xml dd
application/vnd.oma.drm.content dcf
# odf: application/vnd.oasis.opendocument.formula
application/vnd.oma.drm.dcf o4a o4v
application/vnd.oma.drm.message dm
application/vnd.oma.drm.rights+wbxml drc
application/vnd.oma.drm.rights+xml dr
application/vnd.sun.xml.calc sxc
application/vnd.sun.xml.calc.template stc
application/vnd.sun.xml.draw sxd
application/vnd.sun.xml.draw.template std
application/vnd.sun.xml.impress sxi
application/vnd.sun.xml.impress.template sti
application/vnd.sun.xml.math sxm
application/vnd.sun.xml.writer sxw
application/vnd.sun.xml.writer.global sxg
application/vnd.sun.xml.writer.template stw
application/vnd.symbian.install sis
application/vnd.wap.mms-message mms
application/x-annodex anx
application/x-bcpio bcpio
application/x-bittorrent torrent
application/x-bzip2 bz2
application/x-cdlink vcd
application/x-chrome-extension crx
application/x-cpio cpio
application/x-csh csh
application/x-director dcr dir dxr
application/x-dvi dvi
application/x-futuresplash spl
application/x-gtar gtar
application/x-hdf hdf
application/x-java-archive jar
application/x-java-jnlp-file jnlp
application/x-java-pack200 pack
application/x-killustrator kil
application/x-latex latex
application/x-netcdf nc cdf
application/x-perl pl
application/x-rpm rpm
application/x-sh sh
application/x-shar shar
application/x-stuffit sit
application/x-sv4cpio sv4cpio
application/x-sv4crc sv4crc
application/x-tar tar
application/x-tcl tcl
application/x-tex tex
application/x-texinfo texinfo texi
application/x-troff-man man 1 2 3 4 5 6 7 8
application/x-troff-me me
application/x-troff-ms ms
application/x-ustar ustar
application/x-wais-source src
application/x-xpinstall xpi
application/x-xspf+xml xspf
application/x-xz xz
audio/midi mid midi kar
audio/x-aiff aif aiff aifc
audio/x-annodex axa
audio/x-flac flac
audio/x-matroska mka
audio/x-mod mod ult uni m15 mtm 669 med
audio/x-mpegurl m3u
audio/x-ms-wax wax
audio/x-ms-wma wma
audio/x-pn-realaudio ram rm
audio/x-realaudio ra
audio/x-s3m s3m
audio/x-stm stm
audio/x-wav wav
chemical/x-xyz xyz
image/webp webp
image/x-cmu-raster ras
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-targa tga
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
text/html-sandboxed sandboxed
text/x-pod pod
text/x-setext etx
video/webm webm
video/x-annodex axv
video/x-flv flv
video/x-javafx fxm
video/x-matroska mkv
video/x-matroska-3d mk3d
video/x-ms-asf asx
video/x-ms-wm wm
video/x-ms-wmv wmv
video/x-ms-wmx wmx
video/x-ms-wvx wvx
video/x-msvideo avi
video/x-sgi-movie movie
x-conference/x-cooltalk ice
x-epoc/x-sisx-app sisx
......@@ -22,16 +22,15 @@ import (
"fmt"
"io"
"io/ioutil"
"mime"
"net/http"
"os"
"os/user"
"path"
"path/filepath"
"strings"
"github.com/ethereum/go-ethereum/cmd/utils"
swarm "github.com/ethereum/go-ethereum/swarm/api/client"
"github.com/ethereum/go-ethereum/cmd/utils"
"gopkg.in/urfave/cli.v1"
)
......@@ -118,10 +117,9 @@ func upload(ctx *cli.Context) {
return "", fmt.Errorf("error opening file: %s", err)
}
defer f.Close()
if mimeType == "" {
mimeType = detectMimeType(file)
if mimeType != "" {
f.ContentType = mimeType
}
f.ContentType = mimeType
return client.Upload(f, "", toEncrypt)
}
}
......@@ -161,19 +159,3 @@ func homeDir() string {
}
return ""
}
func detectMimeType(file string) string {
if ext := filepath.Ext(file); ext != "" {
return mime.TypeByExtension(ext)
}
f, err := os.Open(file)
if err != nil {
return ""
}
defer f.Close()
buf := make([]byte, 512)
if n, _ := f.Read(buf); n > 0 {
return http.DetectContentType(buf)
}
return ""
}
......@@ -32,7 +32,7 @@ import (
"github.com/ethereum/go-ethereum/log"
swarm "github.com/ethereum/go-ethereum/swarm/api/client"
colorable "github.com/mattn/go-colorable"
"github.com/mattn/go-colorable"
)
var loglevel = flag.Int("loglevel", 3, "verbosity of logs")
......
......@@ -16,6 +16,9 @@
package api
//go:generate mimegen --types=./../../cmd/swarm/mimegen/mime.types --package=api --out=gen_mime.go
//go:generate gofmt -s -w gen_mime.go
import (
"archive/tar"
"context"
......@@ -29,8 +32,6 @@ import (
"path"
"strings"
"github.com/ethereum/go-ethereum/swarm/storage/mru/lookup"
"bytes"
"mime"
"path/filepath"
......@@ -45,7 +46,8 @@ import (
"github.com/ethereum/go-ethereum/swarm/spancontext"
"github.com/ethereum/go-ethereum/swarm/storage"
"github.com/ethereum/go-ethereum/swarm/storage/mru"
opentracing "github.com/opentracing/opentracing-go"
"github.com/ethereum/go-ethereum/swarm/storage/mru/lookup"
"github.com/opentracing/opentracing-go"
)
var (
......@@ -757,9 +759,14 @@ func (a *API) UploadTar(ctx context.Context, bodyReader io.ReadCloser, manifestP
// add the entry under the path from the request
manifestPath := path.Join(manifestPath, hdr.Name)
contentType := hdr.Xattrs["user.swarm.content-type"]
if contentType == "" {
contentType = mime.TypeByExtension(filepath.Ext(hdr.Name))
}
//DetectContentType("")
entry := &ManifestEntry{
Path: manifestPath,
ContentType: hdr.Xattrs["user.swarm.content-type"],
ContentType: contentType,
Mode: hdr.Mode,
Size: hdr.Size,
ModTime: hdr.ModTime,
......@@ -770,10 +777,15 @@ func (a *API) UploadTar(ctx context.Context, bodyReader io.ReadCloser, manifestP
return nil, fmt.Errorf("error adding manifest entry from tar stream: %s", err)
}
if hdr.Name == defaultPath {
contentType := hdr.Xattrs["user.swarm.content-type"]
if contentType == "" {
contentType = mime.TypeByExtension(filepath.Ext(hdr.Name))
}
entry := &ManifestEntry{
Hash: contentKey.Hex(),
Path: "", // default entry
ContentType: hdr.Xattrs["user.swarm.content-type"],
ContentType: contentType,
Mode: hdr.Mode,
Size: hdr.Size,
ModTime: hdr.ModTime,
......@@ -1033,3 +1045,32 @@ func (a *API) ResolveResourceView(ctx context.Context, uri *URI, values mru.Valu
}
return view, nil
}
// MimeOctetStream default value of http Content-Type header
const MimeOctetStream = "application/octet-stream"
// DetectContentType by file file extension, or fallback to content sniff
func DetectContentType(fileName string, f io.ReadSeeker) (string, error) {
ctype := mime.TypeByExtension(filepath.Ext(fileName))
if ctype != "" {
return ctype, nil
}
// save/rollback to get content probe from begin of file
currentPosition, err := f.Seek(0, io.SeekCurrent)
if err != nil {
return MimeOctetStream, fmt.Errorf("seeker can't seek, %s", err)
}
// read a chunk to decide between utf-8 text and binary
var buf [512]byte
n, _ := f.Read(buf[:])
ctype = http.DetectContentType(buf[:n])
_, err = f.Seek(currentPosition, io.SeekStart) // rewind to output whole file
if err != nil {
return MimeOctetStream, fmt.Errorf("seeker can't seek, %s", err)
}
return ctype, nil
}
......@@ -17,6 +17,7 @@
package api
import (
"bytes"
"context"
"errors"
"flag"
......@@ -433,3 +434,69 @@ func TestDecryptOrigin(t *testing.T) {
}
}
}
func TestDetectContentType(t *testing.T) {
for _, tc := range []struct {
file string
content string
expectedContentType string
}{
{
file: "file-with-correct-css.css",
content: "body {background-color: orange}",
expectedContentType: "text/css; charset=utf-8",
},
{
file: "empty-file.css",
content: "",
expectedContentType: "text/css; charset=utf-8",
},
{
file: "empty-file.pdf",
content: "",
expectedContentType: "application/pdf",
},
{
file: "empty-file.md",
content: "",
expectedContentType: "text/markdown; charset=utf-8",
},
{
file: "empty-file-with-unknown-content.strangeext",
content: "",
expectedContentType: "text/plain; charset=utf-8",
},
{
file: "file-with-unknown-extension-and-content.strangeext",
content: "Lorem Ipsum",
expectedContentType: "text/plain; charset=utf-8",
},
{
file: "file-no-extension",
content: "Lorem Ipsum",
expectedContentType: "text/plain; charset=utf-8",
},
{
file: "file-no-extension-no-content",
content: "",
expectedContentType: "text/plain; charset=utf-8",
},
{
file: "css-file-with-html-inside.css",
content: "<!doctype html><html><head></head><body></body></html>",
expectedContentType: "text/css; charset=utf-8",
},
} {
t.Run(tc.file, func(t *testing.T) {
detected, err := DetectContentType(tc.file, bytes.NewReader([]byte(tc.content)))
if err != nil {
t.Fatal(err)
}
if detected != tc.expectedContentType {
t.Fatalf("File: %s, Expected mime type %s, got %s", tc.file, tc.expectedContentType, detected)
}
})
}
}
......@@ -24,7 +24,6 @@ import (
"fmt"
"io"
"io/ioutil"
"mime"
"mime/multipart"
"net/http"
"net/textproto"
......@@ -124,10 +123,16 @@ func Open(path string) (*File, error) {
f.Close()
return nil, err
}
contentType, err := api.DetectContentType(f.Name(), f)
if err != nil {
return nil, err
}
return &File{
ReadCloser: f,
ManifestEntry: api.ManifestEntry{
ContentType: mime.TypeByExtension(filepath.Ext(path)),
ContentType: contentType,
Mode: int64(stat.Mode()),
Size: stat.Size(),
ModTime: stat.ModTime(),
......
......@@ -21,7 +21,6 @@ import (
"context"
"fmt"
"io"
"net/http"
"os"
"path"
"path/filepath"
......@@ -97,51 +96,50 @@ func (fs *FileSystem) Upload(lpath, index string, toEncrypt bool) (string, error
list = append(list, entry)
}
cnt := len(list)
errors := make([]error, cnt)
done := make(chan bool, maxParallelFiles)
dcnt := 0
awg := &sync.WaitGroup{}
errors := make([]error, len(list))
sem := make(chan bool, maxParallelFiles)
defer close(sem)
for i, entry := range list {
if i >= dcnt+maxParallelFiles {
<-done
dcnt++
}
awg.Add(1)
go func(i int, entry *manifestTrieEntry, done chan bool) {
sem <- true
go func(i int, entry *manifestTrieEntry) {
defer func() { <-sem }()
f, err := os.Open(entry.Path)
if err == nil {
stat, _ := f.Stat()
var hash storage.Address
var wait func(context.Context) error
ctx := context.TODO()
hash, wait, err = fs.api.fileStore.Store(ctx, f, stat.Size(), toEncrypt)
if hash != nil {
list[i].Hash = hash.Hex()
}
err = wait(ctx)
awg.Done()
if err == nil {
first512 := make([]byte, 512)
fread, _ := f.ReadAt(first512, 0)
if fread > 0 {
mimeType := http.DetectContentType(first512[:fread])
if filepath.Ext(entry.Path) == ".css" {
mimeType = "text/css"
}
list[i].ContentType = mimeType
}
}
f.Close()
if err != nil {
errors[i] = err
return
}
defer f.Close()
stat, err := f.Stat()
if err != nil {
errors[i] = err
return
}
var hash storage.Address
var wait func(context.Context) error
ctx := context.TODO()
hash, wait, err = fs.api.fileStore.Store(ctx, f, stat.Size(), toEncrypt)
if hash != nil {
list[i].Hash = hash.Hex()
}
errors[i] = err
done <- true
}(i, entry, done)
if err := wait(ctx); err != nil {
errors[i] = err
return
}
list[i].ContentType, err = DetectContentType(f.Name(), f)
if err != nil {
errors[i] = err
return
}
}(i, entry)
}
for dcnt < cnt {
<-done
dcnt++
for i := 0; i < cap(sem); i++ {
sem <- true
}
trie := &manifestTrie{
......@@ -168,7 +166,6 @@ func (fs *FileSystem) Upload(lpath, index string, toEncrypt bool) (string, error
if err2 == nil {
hs = trie.ref.Hex()
}
awg.Wait()
return hs, err2
}
......
......@@ -60,7 +60,7 @@ func TestApiDirUpload0(t *testing.T) {
content = readPath(t, "testdata", "test0", "index.css")
resp = testGet(t, api, bzzhash, "index.css")
exp = expResponse(content, "text/css", 0)
exp = expResponse(content, "text/css; charset=utf-8", 0)
checkResponse(t, resp, exp)
addr := storage.Address(common.Hex2Bytes(bzzhash))
......@@ -140,7 +140,7 @@ func TestApiDirUploadModify(t *testing.T) {
content = readPath(t, "testdata", "test0", "index.css")
resp = testGet(t, api, bzzhash, "index.css")
exp = expResponse(content, "text/css", 0)
exp = expResponse(content, "text/css; charset=utf-8", 0)
checkResponse(t, resp, exp)
_, _, _, _, err = api.Get(context.TODO(), nil, addr, "")
......
// Code generated by github.com/ethereum/go-ethereum/cmd/swarm/mimegen. DO NOT EDIT.
package api
import "mime"
func init() {
var mimeTypes = map[string]string{
".a2l": "application/A2L",
".aml": "application/AML",
".ez": "application/andrew-inset",
".atf": "application/ATF",
".atfx": "application/ATFX",
".atxml": "application/ATXML",
".atom": "application/atom+xml",
".atomcat": "application/atomcat+xml",
".atomdeleted": "application/atomdeleted+xml",
".atomsvc": "application/atomsvc+xml",
".apxml": "application/auth-policy+xml",
".xdd": "application/bacnet-xdd+zip",
".xcs": "application/calendar+xml",
".cbor": "application/cbor",
".ccmp": "application/ccmp+xml",
".ccxml": "application/ccxml+xml",
".cdfx": "application/CDFX+XML",
".cdmia": "application/cdmi-capability",
".cdmic": "application/cdmi-container",
".cdmid": "application/cdmi-domain",
".cdmio": "application/cdmi-object",
".cdmiq": "application/cdmi-queue",
".cea": "application/CEA",
".cellml": "application/cellml+xml",
".cml": "application/cellml+xml",
".clue": "application/clue_info+xml",
".cmsc": "application/cms",
".cpl": "application/cpl+xml",
".csrattrs": "application/csrattrs",
".mpd": "application/dash+xml",
".mpdd": "application/dashdelta",
".davmount": "application/davmount+xml",
".dcd": "application/DCD",
".dcm": "application/dicom",
".dii": "application/DII",
".dit": "application/DIT",
".xmls": "application/dskpp+xml",
".dssc": "application/dssc+der",
".xdssc": "application/dssc+xml",
".dvc": "application/dvcs",
".es": "application/ecmascript",
".efi": "application/efi",
".emma": "application/emma+xml",
".emotionml": "application/emotionml+xml",
".epub": "application/epub+zip",
".exi": "application/exi",
".finf": "application/fastinfoset",
".fdt": "application/fdt+xml",
".pfr": "application/font-tdpfr",
".geojson": "application/geo+json",
".gml": "application/gml+xml",
".gz": "application/gzip",
".tgz": "application/gzip",
".stk": "application/hyperstudio",
".ink": "application/inkml+xml",
".inkml": "application/inkml+xml",
".ipfix": "application/ipfix",
".its": "application/its+xml",
".js": "application/javascript",
".jrd": "application/jrd+json",
".json": "application/json",
".json-patch": "application/json-patch+json",
".jsonld": "application/ld+json",
".lgr": "application/lgr+xml",
".wlnk": "application/link-format",
".lostxml": "application/lost+xml",
".lostsyncxml": "application/lostsync+xml",
".lxf": "application/LXF",
".hqx": "application/mac-binhex40",
".mads": "application/mads+xml",
".mrc": "application/marc",
".mrcx": "application/marcxml+xml",
".nb": "application/mathematica",
".ma": "application/mathematica",
".mb": "application/mathematica",
".mml": "application/mathml+xml",
".mbox": "application/mbox",
".meta4": "application/metalink4+xml",
".mets": "application/mets+xml",
".mf4": "application/MF4",
".mods": "application/mods+xml",
".m21": "application/mp21",
".mp21": "application/mp21",
".doc": "application/msword",
".mxf": "application/mxf",
".nq": "application/n-quads",
".nt": "application/n-triples",
".orq": "application/ocsp-request",
".ors": "application/ocsp-response",
".bin": "application/octet-stream",
".lha": "application/octet-stream",
".lzh": "application/octet-stream",
".exe": "application/octet-stream",
".class": "application/octet-stream",
".so": "application/octet-stream",
".dll": "application/octet-stream",
".img": "application/octet-stream",
".iso": "application/octet-stream",
".oda": "application/oda",
".odx": "application/ODX",
".opf": "application/oebps-package+xml",
".ogx": "application/ogg",
".oxps": "application/oxps",
".relo": "application/p2p-overlay+xml",
".pdf": "application/pdf",
".pdx": "application/PDX",
".pgp": "application/pgp-encrypted",
".sig": "application/pgp-signature",
".p10": "application/pkcs10",
".p12": "application/pkcs12",
".pfx": "application/pkcs12",
".p7m": "application/pkcs7-mime",
".p7c": "application/pkcs7-mime",
".p7s": "application/pkcs7-signature",
".p8": "application/pkcs8",
".cer": "application/pkix-cert",
".crl": "application/pkix-crl",
".pkipath": "application/pkix-pkipath",
".pki": "application/pkixcmp",
".pls": "application/pls+xml",
".ps": "application/postscript",
".eps": "application/postscript",
".ai": "application/postscript",
".provx": "application/provenance+xml",
".cw": "application/prs.cww",
".cww": "application/prs.cww",
".hpub": "application/prs.hpub+zip",
".rnd": "application/prs.nprend",
".rct": "application/prs.nprend",
".rdf-crypt": "application/prs.rdf-xml-crypt",
".xsf": "application/prs.xsf+xml",
".pskcxml": "application/pskc+xml",
".rdf": "application/rdf+xml",
".rif": "application/reginfo+xml",
".rnc": "application/relax-ng-compact-syntax",
".rld": "application/resource-lists-diff+xml",
".rl": "application/resource-lists+xml",
".rfcxml": "application/rfc+xml",
".rs": "application/rls-services+xml",
".gbr": "application/rpki-ghostbusters",
".mft": "application/rpki-manifest",
".roa": "application/rpki-roa",
".rtf": "application/rtf",
".scim": "application/scim+json",
".scq": "application/scvp-cv-request",
".scs": "application/scvp-cv-response",
".spq": "application/scvp-vp-request",
".spp": "application/scvp-vp-response",
".sdp": "application/sdp",
".soc": "application/sgml-open-catalog",
".shf": "application/shf+xml",
".siv": "application/sieve",
".sieve": "application/sieve",
".cl": "application/simple-filter+xml",
".smil": "application/smil+xml",
".smi": "application/smil+xml",
".sml": "application/smil+xml",
".rq": "application/sparql-query",
".srx": "application/sparql-results+xml",
".sql": "application/sql",
".gram": "application/srgs",
".grxml": "application/srgs+xml",
".sru": "application/sru+xml",
".ssml": "application/ssml+xml",
".tau": "application/tamp-apex-update",
".auc": "application/tamp-apex-update-confirm",
".tcu": "application/tamp-community-update",
".cuc": "application/tamp-community-update-confirm",
".ter": "application/tamp-error",
".tsa": "application/tamp-sequence-adjust",
".sac": "application/tamp-sequence-adjust-confirm",
".tur": "application/tamp-update",
".tuc": "application/tamp-update-confirm",
".tei": "application/tei+xml",
".teiCorpus": "application/tei+xml",
".odd": "application/tei+xml",
".tfi": "application/thraud+xml",
".tsq": "application/timestamp-query",
".tsr": "application/timestamp-reply",
".tsd": "application/timestamped-data",
".trig": "application/trig",
".ttml": "application/ttml+xml",
".gsheet": "application/urc-grpsheet+xml",
".rsheet": "application/urc-ressheet+xml",
".td": "application/urc-targetdesc+xml",
".uis": "application/urc-uisocketdesc+xml",
".plb": "application/vnd.3gpp.pic-bw-large",
".psb": "application/vnd.3gpp.pic-bw-small",
".pvb": "application/vnd.3gpp.pic-bw-var",
".sms": "application/vnd.3gpp2.sms",
".tcap": "application/vnd.3gpp2.tcap",
".imgcal": "application/vnd.3lightssoftware.imagescal",
".pwn": "application/vnd.3M.Post-it-Notes",
".aso": "application/vnd.accpac.simply.aso",
".imp": "application/vnd.accpac.simply.imp",
".acu": "application/vnd.acucobol",
".atc": "application/vnd.acucorp",
".acutc": "application/vnd.acucorp",
".swf": "application/vnd.adobe.flash.movie",
".fcdt": "application/vnd.adobe.formscentral.fcdt",
".fxp": "application/vnd.adobe.fxp",
".fxpl": "application/vnd.adobe.fxp",
".xdp": "application/vnd.adobe.xdp+xml",
".xfdf": "application/vnd.adobe.xfdf",
".ahead": "application/vnd.ahead.space",
".azf": "application/vnd.airzip.filesecure.azf",
".azs": "application/vnd.airzip.filesecure.azs",
".azw3": "application/vnd.amazon.mobi8-ebook",
".acc": "application/vnd.americandynamics.acc",
".ami": "application/vnd.amiga.ami",
".apkg": "application/vnd.anki",
".cii": "application/vnd.anser-web-certificate-issue-initiation",
".fti": "application/vnd.anser-web-funds-transfer-initiation",
".dist": "application/vnd.apple.installer+xml",
".distz": "application/vnd.apple.installer+xml",
".pkg": "application/vnd.apple.installer+xml",
".mpkg": "application/vnd.apple.installer+xml",
".m3u8": "application/vnd.apple.mpegurl",
".swi": "application/vnd.aristanetworks.swi",
".iota": "application/vnd.astraea-software.iota",
".aep": "application/vnd.audiograph",
".package": "application/vnd.autopackage",
".bmml": "application/vnd.balsamiq.bmml+xml",
".bmpr": "application/vnd.balsamiq.bmpr",
".mpm": "application/vnd.blueice.multipass",
".ep": "application/vnd.bluetooth.ep.oob",
".le": "application/vnd.bluetooth.le.oob",
".bmi": "application/vnd.bmi",
".rep": "application/vnd.businessobjects",
".tlclient": "application/vnd.cendio.thinlinc.clientconf",
".cdxml": "application/vnd.chemdraw+xml",
".pgn": "application/vnd.chess-pgn",
".mmd": "application/vnd.chipnuts.karaoke-mmd",
".cdy": "application/vnd.cinderella",
".csl": "application/vnd.citationstyles.style+xml",
".cla": "application/vnd.claymore",
".rp9": "application/vnd.cloanto.rp9",
".c4g": "application/vnd.clonk.c4group",
".c4d": "application/vnd.clonk.c4group",
".c4f": "application/vnd.clonk.c4group",
".c4p": "application/vnd.clonk.c4group",
".c4u": "application/vnd.clonk.c4group",
".c11amc": "application/vnd.cluetrust.cartomobile-config",
".c11amz": "application/vnd.cluetrust.cartomobile-config-pkg",
".coffee": "application/vnd.coffeescript",
".cbz": "application/vnd.comicbook+zip",
".ica": "application/vnd.commerce-battelle",
".icf": "application/vnd.commerce-battelle",
".icd": "application/vnd.commerce-battelle",
".ic0": "application/vnd.commerce-battelle",
".ic1": "application/vnd.commerce-battelle",
".ic2": "application/vnd.commerce-battelle",
".ic3": "application/vnd.commerce-battelle",
".ic4": "application/vnd.commerce-battelle",
".ic5": "application/vnd.commerce-battelle",
".ic6": "application/vnd.commerce-battelle",
".ic7": "application/vnd.commerce-battelle",
".ic8": "application/vnd.commerce-battelle",
".csp": "application/vnd.commonspace",
".cst": "application/vnd.commonspace",
".cdbcmsg": "application/vnd.contact.cmsg",
".ign": "application/vnd.coreos.ignition+json",
".ignition": "application/vnd.coreos.ignition+json",
".cmc": "application/vnd.cosmocaller",
".clkx": "application/vnd.crick.clicker",
".clkk": "application/vnd.crick.clicker.keyboard",
".clkp": "application/vnd.crick.clicker.palette",
".clkt": "application/vnd.crick.clicker.template",
".clkw": "application/vnd.crick.clicker.wordbank",
".wbs": "application/vnd.criticaltools.wbs+xml",
".pml": "application/vnd.ctc-posml",
".ppd": "application/vnd.cups-ppd",
".curl": "application/vnd.curl",
".dart": "application/vnd.dart",
".rdz": "application/vnd.data-vision.rdz",
".deb": "application/vnd.debian.binary-package",
".udeb": "application/vnd.debian.binary-package",
".uvf": "application/vnd.dece.data",
".uvvf": "application/vnd.dece.data",
".uvd": "application/vnd.dece.data",
".uvvd": "application/vnd.dece.data",
".uvt": "application/vnd.dece.ttml+xml",
".uvvt": "application/vnd.dece.ttml+xml",
".uvx": "application/vnd.dece.unspecified",
".uvvx": "application/vnd.dece.unspecified",
".uvz": "application/vnd.dece.zip",
".uvvz": "application/vnd.dece.zip",
".fe_launch": "application/vnd.denovo.fcselayout-link",
".dsm": "application/vnd.desmume.movie",
".dna": "application/vnd.dna",
".docjson": "application/vnd.document+json",
".scld": "application/vnd.doremir.scorecloud-binary-document",
".dpg": "application/vnd.dpgraph",
".mwc": "application/vnd.dpgraph",
".dpgraph": "application/vnd.dpgraph",
".dfac": "application/vnd.dreamfactory",
".fla": "application/vnd.dtg.local.flash",
".ait": "application/vnd.dvb.ait",
".svc": "application/vnd.dvb.service",
".geo": "application/vnd.dynageo",
".dzr": "application/vnd.dzr",
".mag": "application/vnd.ecowin.chart",
".nml": "application/vnd.enliven",
".esf": "application/vnd.epson.esf",
".msf": "application/vnd.epson.msf",
".qam": "application/vnd.epson.quickanime",
".slt": "application/vnd.epson.salt",
".ssf": "application/vnd.epson.ssf",
".qcall": "application/vnd.ericsson.quickcall",
".qca": "application/vnd.ericsson.quickcall",
".espass": "application/vnd.espass-espass+zip",
".es3": "application/vnd.eszigno3+xml",
".et3": "application/vnd.eszigno3+xml",
".asice": "application/vnd.etsi.asic-e+zip",
".sce": "application/vnd.etsi.asic-e+zip",
".asics": "application/vnd.etsi.asic-s+zip",
".tst": "application/vnd.etsi.timestamp-token",
".ez2": "application/vnd.ezpix-album",
".ez3": "application/vnd.ezpix-package",
".dim": "application/vnd.fastcopy-disk-image",
".fdf": "application/vnd.fdf",
".msd": "application/vnd.fdsn.mseed",
".mseed": "application/vnd.fdsn.mseed",
".seed": "application/vnd.fdsn.seed",
".dataless": "application/vnd.fdsn.seed",
".zfc": "application/vnd.filmit.zfc",
".gph": "application/vnd.FloGraphIt",
".ftc": "application/vnd.fluxtime.clip",
".sfd": "application/vnd.font-fontforge-sfd",
".fm": "application/vnd.framemaker",
".fnc": "application/vnd.frogans.fnc",
".ltf": "application/vnd.frogans.ltf",
".fsc": "application/vnd.fsc.weblaunch",
".oas": "application/vnd.fujitsu.oasys",
".oa2": "application/vnd.fujitsu.oasys2",
".oa3": "application/vnd.fujitsu.oasys3",
".fg5": "application/vnd.fujitsu.oasysgp",
".bh2": "application/vnd.fujitsu.oasysprs",
".ddd": "application/vnd.fujixerox.ddd",
".xdw": "application/vnd.fujixerox.docuworks",
".xbd": "application/vnd.fujixerox.docuworks.binder",
".xct": "application/vnd.fujixerox.docuworks.container",
".fzs": "application/vnd.fuzzysheet",
".txd": "application/vnd.genomatix.tuxedo",
".g3": "application/vnd.geocube+xml",
".g³": "application/vnd.geocube+xml",
".ggb": "application/vnd.geogebra.file",
".ggt": "application/vnd.geogebra.tool",
".gex": "application/vnd.geometry-explorer",
".gre": "application/vnd.geometry-explorer",
".gxt": "application/vnd.geonext",
".g2w": "application/vnd.geoplan",
".g3w": "application/vnd.geospace",
".gmx": "application/vnd.gmx",
".kml": "application/vnd.google-earth.kml+xml",
".kmz": "application/vnd.google-earth.kmz",
".gqf": "application/vnd.grafeq",
".gqs": "application/vnd.grafeq",
".gac": "application/vnd.groove-account",
".ghf": "application/vnd.groove-help",
".gim": "application/vnd.groove-identity-message",
".grv": "application/vnd.groove-injector",
".gtm": "application/vnd.groove-tool-message",
".tpl": "application/vnd.groove-tool-template",
".vcg": "application/vnd.groove-vcard",
".hal": "application/vnd.hal+xml",
".zmm": "application/vnd.HandHeld-Entertainment+xml",
".hbci": "application/vnd.hbci",
".hbc": "application/vnd.hbci",
".kom": "application/vnd.hbci",
".upa": "application/vnd.hbci",
".pkd": "application/vnd.hbci",
".bpd": "application/vnd.hbci",
".hdt": "application/vnd.hdt",
".les": "application/vnd.hhe.lesson-player",
".hpgl": "application/vnd.hp-HPGL",
".hpi": "application/vnd.hp-hpid",
".hpid": "application/vnd.hp-hpid",
".hps": "application/vnd.hp-hps",
".jlt": "application/vnd.hp-jlyt",
".pcl": "application/vnd.hp-PCL",
".sfd-hdstx": "application/vnd.hydrostatix.sof-data",
".x3d": "application/vnd.hzn-3d-crossword",
".emm": "application/vnd.ibm.electronic-media",
".mpy": "application/vnd.ibm.MiniPay",
".list3820": "application/vnd.ibm.modcap",
".listafp": "application/vnd.ibm.modcap",
".afp": "application/vnd.ibm.modcap",
".pseg3820": "application/vnd.ibm.modcap",
".irm": "application/vnd.ibm.rights-management",
".sc": "application/vnd.ibm.secure-container",
".icc": "application/vnd.iccprofile",
".icm": "application/vnd.iccprofile",
".1905.1": "application/vnd.ieee.1905",
".igl": "application/vnd.igloader",
".imf": "application/vnd.imagemeter.folder+zip",
".imi": "application/vnd.imagemeter.image+zip",
".ivp": "application/vnd.immervision-ivp",
".ivu": "application/vnd.immervision-ivu",
".imscc": "application/vnd.ims.imsccv1p1",
".igm": "application/vnd.insors.igm",
".xpw": "application/vnd.intercon.formnet",
".xpx": "application/vnd.intercon.formnet",
".i2g": "application/vnd.intergeo",
".qbo": "application/vnd.intu.qbo",
".qfx": "application/vnd.intu.qfx",
".rcprofile": "application/vnd.ipunplugged.rcprofile",
".irp": "application/vnd.irepository.package+xml",
".xpr": "application/vnd.is-xpr",
".fcs": "application/vnd.isac.fcs",
".jam": "application/vnd.jam",
".rms": "application/vnd.jcp.javame.midlet-rms",
".jisp": "application/vnd.jisp",
".joda": "application/vnd.joost.joda-archive",
".ktz": "application/vnd.kahootz",
".ktr": "application/vnd.kahootz",
".karbon": "application/vnd.kde.karbon",
".chrt": "application/vnd.kde.kchart",
".kfo": "application/vnd.kde.kformula",
".flw": "application/vnd.kde.kivio",
".kon": "application/vnd.kde.kontour",
".kpr": "application/vnd.kde.kpresenter",
".kpt": "application/vnd.kde.kpresenter",
".ksp": "application/vnd.kde.kspread",
".kwd": "application/vnd.kde.kword",
".kwt": "application/vnd.kde.kword",
".htke": "application/vnd.kenameaapp",
".kia": "application/vnd.kidspiration",
".kne": "application/vnd.Kinar",
".knp": "application/vnd.Kinar",
".sdf": "application/vnd.Kinar",
".skp": "application/vnd.koan",
".skd": "application/vnd.koan",
".skm": "application/vnd.koan",
".skt": "application/vnd.koan",
".sse": "application/vnd.kodak-descriptor",
".lasjson": "application/vnd.las.las+json",
".lasxml": "application/vnd.las.las+xml",
".lbd": "application/vnd.llamagraphics.life-balance.desktop",
".lbe": "application/vnd.llamagraphics.life-balance.exchange+xml",
".123": "application/vnd.lotus-1-2-3",
".wk4": "application/vnd.lotus-1-2-3",
".wk3": "application/vnd.lotus-1-2-3",
".wk1": "application/vnd.lotus-1-2-3",
".apr": "application/vnd.lotus-approach",
".vew": "application/vnd.lotus-approach",
".prz": "application/vnd.lotus-freelance",
".pre": "application/vnd.lotus-freelance",
".nsf": "application/vnd.lotus-notes",
".ntf": "application/vnd.lotus-notes",
".ndl": "application/vnd.lotus-notes",
".ns4": "application/vnd.lotus-notes",
".ns3": "application/vnd.lotus-notes",
".ns2": "application/vnd.lotus-notes",
".nsh": "application/vnd.lotus-notes",
".nsg": "application/vnd.lotus-notes",
".or3": "application/vnd.lotus-organizer",
".or2": "application/vnd.lotus-organizer",
".org": "application/vnd.lotus-organizer",
".scm": "application/vnd.lotus-screencam",
".lwp": "application/vnd.lotus-wordpro",
".sam": "application/vnd.lotus-wordpro",
".portpkg": "application/vnd.macports.portpkg",
".mvt": "application/vnd.mapbox-vector-tile",
".mdc": "application/vnd.marlin.drm.mdcf",
".mmdb": "application/vnd.maxmind.maxmind-db",
".mcd": "application/vnd.mcd",
".mc1": "application/vnd.medcalcdata",
".cdkey": "application/vnd.mediastation.cdkey",
".mwf": "application/vnd.MFER",
".mfm": "application/vnd.mfmp",
".flo": "application/vnd.micrografx.flo",
".igx": "application/vnd.micrografx.igx",
".mif": "application/vnd.mif",
".daf": "application/vnd.Mobius.DAF",
".dis": "application/vnd.Mobius.DIS",
".mbk": "application/vnd.Mobius.MBK",
".mqy": "application/vnd.Mobius.MQY",
".msl": "application/vnd.Mobius.MSL",
".plc": "application/vnd.Mobius.PLC",
".txf": "application/vnd.Mobius.TXF",
".mpn": "application/vnd.mophun.application",
".mpc": "application/vnd.mophun.certificate",
".xul": "application/vnd.mozilla.xul+xml",
".3mf": "application/vnd.ms-3mfdocument",
".cil": "application/vnd.ms-artgalry",
".asf": "application/vnd.ms-asf",
".cab": "application/vnd.ms-cab-compressed",
".xls": "application/vnd.ms-excel",
".xlm": "application/vnd.ms-excel",
".xla": "application/vnd.ms-excel",
".xlc": "application/vnd.ms-excel",
".xlt": "application/vnd.ms-excel",
".xlw": "application/vnd.ms-excel",
".xltm": "application/vnd.ms-excel.template.macroEnabled.12",
".xlam": "application/vnd.ms-excel.addin.macroEnabled.12",
".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12",
".eot": "application/vnd.ms-fontobject",
".chm": "application/vnd.ms-htmlhelp",
".ims": "application/vnd.ms-ims",
".lrm": "application/vnd.ms-lrm",
".thmx": "application/vnd.ms-officetheme",
".ppt": "application/vnd.ms-powerpoint",
".pps": "application/vnd.ms-powerpoint",
".pot": "application/vnd.ms-powerpoint",
".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12",
".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
".sldm": "application/vnd.ms-powerpoint.slide.macroEnabled.12",
".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
".potm": "application/vnd.ms-powerpoint.template.macroEnabled.12",
".mpp": "application/vnd.ms-project",
".mpt": "application/vnd.ms-project",
".tnef": "application/vnd.ms-tnef",
".tnf": "application/vnd.ms-tnef",
".docm": "application/vnd.ms-word.document.macroEnabled.12",
".dotm": "application/vnd.ms-word.template.macroEnabled.12",
".wcm": "application/vnd.ms-works",
".wdb": "application/vnd.ms-works",
".wks": "application/vnd.ms-works",
".wps": "application/vnd.ms-works",
".wpl": "application/vnd.ms-wpl",
".xps": "application/vnd.ms-xpsdocument",
".msa": "application/vnd.msa-disk-image",
".mseq": "application/vnd.mseq",
".crtr": "application/vnd.multiad.creator",
".cif": "application/vnd.multiad.creator.cif",
".mus": "application/vnd.musician",
".msty": "application/vnd.muvee.style",
".taglet": "application/vnd.mynfc",
".entity": "application/vnd.nervana",
".request": "application/vnd.nervana",
".bkm": "application/vnd.nervana",
".kcm": "application/vnd.nervana",
".nitf": "application/vnd.nitf",
".nlu": "application/vnd.neurolanguage.nlu",
".nds": "application/vnd.nintendo.nitro.rom",
".sfc": "application/vnd.nintendo.snes.rom",
".smc": "application/vnd.nintendo.snes.rom",
".nnd": "application/vnd.noblenet-directory",
".nns": "application/vnd.noblenet-sealer",
".nnw": "application/vnd.noblenet-web",
".ac": "application/vnd.nokia.n-gage.ac+xml",
".ngdat": "application/vnd.nokia.n-gage.data",
".n-gage": "application/vnd.nokia.n-gage.symbian.install",
".rpst": "application/vnd.nokia.radio-preset",
".rpss": "application/vnd.nokia.radio-presets",
".edm": "application/vnd.novadigm.EDM",
".edx": "application/vnd.novadigm.EDX",
".ext": "application/vnd.novadigm.EXT",
".odc": "application/vnd.oasis.opendocument.chart",
".otc": "application/vnd.oasis.opendocument.chart-template",
".odb": "application/vnd.oasis.opendocument.database",
".odf": "application/vnd.oasis.opendocument.formula",
".odg": "application/vnd.oasis.opendocument.graphics",
".otg": "application/vnd.oasis.opendocument.graphics-template",
".odi": "application/vnd.oasis.opendocument.image",
".oti": "application/vnd.oasis.opendocument.image-template",
".odp": "application/vnd.oasis.opendocument.presentation",
".otp": "application/vnd.oasis.opendocument.presentation-template",
".ods": "application/vnd.oasis.opendocument.spreadsheet",
".ots": "application/vnd.oasis.opendocument.spreadsheet-template",
".odt": "application/vnd.oasis.opendocument.text",
".odm": "application/vnd.oasis.opendocument.text-master",
".ott": "application/vnd.oasis.opendocument.text-template",
".oth": "application/vnd.oasis.opendocument.text-web",
".xo": "application/vnd.olpc-sugar",
".dd2": "application/vnd.oma.dd2+xml",
".tam": "application/vnd.onepager",
".tamp": "application/vnd.onepagertamp",
".tamx": "application/vnd.onepagertamx",
".tat": "application/vnd.onepagertat",
".tatp": "application/vnd.onepagertatp",
".tatx": "application/vnd.onepagertatx",
".obgx": "application/vnd.openblox.game+xml",
".obg": "application/vnd.openblox.game-binary",
".oeb": "application/vnd.openeye.oeb",
".oxt": "application/vnd.openofficeorg.extension",
".osm": "application/vnd.openstreetmap.data+xml",
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide",
".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
".potx": "application/vnd.openxmlformats-officedocument.presentationml.template",
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
".ndc": "application/vnd.osa.netdeploy",
".mgp": "application/vnd.osgeo.mapguide.package",
".dp": "application/vnd.osgi.dp",
".esa": "application/vnd.osgi.subsystem",
".oxlicg": "application/vnd.oxli.countgraph",
".prc": "application/vnd.palm",
".pdb": "application/vnd.palm",
".pqa": "application/vnd.palm",
".oprc": "application/vnd.palm",
".plp": "application/vnd.panoply",
".paw": "application/vnd.pawaafile",
".str": "application/vnd.pg.format",
".ei6": "application/vnd.pg.osasli",
".pil": "application/vnd.piaccess.application-license",
".efif": "application/vnd.picsel",
".wg": "application/vnd.pmi.widget",
".plf": "application/vnd.pocketlearn",
".pbd": "application/vnd.powerbuilder6",
".preminet": "application/vnd.preminet",
".box": "application/vnd.previewsystems.box",
".vbox": "application/vnd.previewsystems.box",
".mgz": "application/vnd.proteus.magazine",
".qps": "application/vnd.publishare-delta-tree",
".ptid": "application/vnd.pvi.ptid1",
".bar": "application/vnd.qualcomm.brew-app-res",
".qxd": "application/vnd.Quark.QuarkXPress",
".qxt": "application/vnd.Quark.QuarkXPress",
".qwd": "application/vnd.Quark.QuarkXPress",
".qwt": "application/vnd.Quark.QuarkXPress",
".qxl": "application/vnd.Quark.QuarkXPress",
".qxb": "application/vnd.Quark.QuarkXPress",
".quox": "application/vnd.quobject-quoxdocument",
".quiz": "application/vnd.quobject-quoxdocument",
".tree": "application/vnd.rainstor.data",
".rar": "application/vnd.rar",
".bed": "application/vnd.realvnc.bed",
".mxl": "application/vnd.recordare.musicxml",
".cryptonote": "application/vnd.rig.cryptonote",
".link66": "application/vnd.route66.link66+xml",
".st": "application/vnd.sailingtracker.track",
".scd": "application/vnd.scribus",
".sla": "application/vnd.scribus",
".slaz": "application/vnd.scribus",
".s3df": "application/vnd.sealed.3df",
".scsf": "application/vnd.sealed.csf",
".sdoc": "application/vnd.sealed.doc",
".sdo": "application/vnd.sealed.doc",
".s1w": "application/vnd.sealed.doc",
".seml": "application/vnd.sealed.eml",
".sem": "application/vnd.sealed.eml",
".smht": "application/vnd.sealed.mht",
".smh": "application/vnd.sealed.mht",
".sppt": "application/vnd.sealed.ppt",
".s1p": "application/vnd.sealed.ppt",
".stif": "application/vnd.sealed.tiff",
".sxls": "application/vnd.sealed.xls",
".sxl": "application/vnd.sealed.xls",
".s1e": "application/vnd.sealed.xls",
".stml": "application/vnd.sealedmedia.softseal.html",
".s1h": "application/vnd.sealedmedia.softseal.html",
".spdf": "application/vnd.sealedmedia.softseal.pdf",
".spd": "application/vnd.sealedmedia.softseal.pdf",
".s1a": "application/vnd.sealedmedia.softseal.pdf",
".see": "application/vnd.seemail",
".sema": "application/vnd.sema",
".semd": "application/vnd.semd",
".semf": "application/vnd.semf",
".ifm": "application/vnd.shana.informed.formdata",
".itp": "application/vnd.shana.informed.formtemplate",
".iif": "application/vnd.shana.informed.interchange",
".ipk": "application/vnd.shana.informed.package",
".twd": "application/vnd.SimTech-MindMapper",
".twds": "application/vnd.SimTech-MindMapper",
".mmf": "application/vnd.smaf",
".notebook": "application/vnd.smart.notebook",
".teacher": "application/vnd.smart.teacher",
".fo": "application/vnd.software602.filler.form+xml",
".zfo": "application/vnd.software602.filler.form-xml-zip",
".sdkm": "application/vnd.solent.sdkm+xml",
".sdkd": "application/vnd.solent.sdkm+xml",
".dxp": "application/vnd.spotfire.dxp",
".sfs": "application/vnd.spotfire.sfs",
".smzip": "application/vnd.stepmania.package",
".sm": "application/vnd.stepmania.stepchart",
".wadl": "application/vnd.sun.wadl+xml",
".sus": "application/vnd.sus-calendar",
".susp": "application/vnd.sus-calendar",
".xsm": "application/vnd.syncml+xml",
".bdm": "application/vnd.syncml.dm+wbxml",
".xdm": "application/vnd.syncml.dm+xml",
".ddf": "application/vnd.syncml.dmddf+xml",
".tao": "application/vnd.tao.intent-module-archive",
".pcap": "application/vnd.tcpdump.pcap",
".cap": "application/vnd.tcpdump.pcap",
".dmp": "application/vnd.tcpdump.pcap",
".qvd": "application/vnd.theqvd",
".vfr": "application/vnd.tml",
".viaframe": "application/vnd.tml",
".tmo": "application/vnd.tmobile-livetv",
".tpt": "application/vnd.trid.tpt",
".mxs": "application/vnd.triscape.mxs",
".tra": "application/vnd.trueapp",
".ufdl": "application/vnd.ufdl",
".ufd": "application/vnd.ufdl",
".frm": "application/vnd.ufdl",
".utz": "application/vnd.uiq.theme",
".umj": "application/vnd.umajin",
".unityweb": "application/vnd.unity",
".uoml": "application/vnd.uoml+xml",
".uo": "application/vnd.uoml+xml",
".urim": "application/vnd.uri-map",
".urimap": "application/vnd.uri-map",
".vmt": "application/vnd.valve.source.material",
".vcx": "application/vnd.vcx",
".mxi": "application/vnd.vd-study",
".study-inter": "application/vnd.vd-study",
".model-inter": "application/vnd.vd-study",
".vwx": "application/vnd.vectorworks",
".vsc": "application/vnd.vidsoft.vidconference",
".vsd": "application/vnd.visio",
".vst": "application/vnd.visio",
".vsw": "application/vnd.visio",
".vss": "application/vnd.visio",
".vis": "application/vnd.visionary",
".vsf": "application/vnd.vsf",
".sic": "application/vnd.wap.sic",
".slc": "application/vnd.wap.slc",
".wbxml": "application/vnd.wap.wbxml",
".wmlc": "application/vnd.wap.wmlc",
".wmlsc": "application/vnd.wap.wmlscriptc",
".wtb": "application/vnd.webturbo",
".p2p": "application/vnd.wfa.p2p",
".wsc": "application/vnd.wfa.wsc",
".wmc": "application/vnd.wmc",
".m": "application/vnd.wolfram.mathematica.package",
".nbp": "application/vnd.wolfram.player",
".wpd": "application/vnd.wordperfect",
".wqd": "application/vnd.wqd",
".stf": "application/vnd.wt.stf",
".wv": "application/vnd.wv.csp+wbxml",
".xar": "application/vnd.xara",
".xfdl": "application/vnd.xfdl",
".xfd": "application/vnd.xfdl",
".cpkg": "application/vnd.xmpie.cpkg",
".dpkg": "application/vnd.xmpie.dpkg",
".ppkg": "application/vnd.xmpie.ppkg",
".xlim": "application/vnd.xmpie.xlim",
".hvd": "application/vnd.yamaha.hv-dic",
".hvs": "application/vnd.yamaha.hv-script",
".hvp": "application/vnd.yamaha.hv-voice",
".osf": "application/vnd.yamaha.openscoreformat",
".saf": "application/vnd.yamaha.smaf-audio",
".spf": "application/vnd.yamaha.smaf-phrase",
".yme": "application/vnd.yaoweme",
".cmp": "application/vnd.yellowriver-custom-menu",
".zir": "application/vnd.zul",
".zirz": "application/vnd.zul",
".zaz": "application/vnd.zzazz.deck+xml",
".vxml": "application/voicexml+xml",
".wif": "application/watcherinfo+xml",
".wgt": "application/widget",
".wsdl": "application/wsdl+xml",
".wspolicy": "application/wspolicy+xml",
".xav": "application/xcap-att+xml",
".xca": "application/xcap-caps+xml",
".xdf": "application/xcap-diff+xml",
".xel": "application/xcap-el+xml",
".xer": "application/xcap-error+xml",
".xns": "application/xcap-ns+xml",
".xhtml": "application/xhtml+xml",
".xhtm": "application/xhtml+xml",
".xht": "application/xhtml+xml",
".dtd": "application/xml-dtd",
".xop": "application/xop+xml",
".xsl": "application/xslt+xml",
".xslt": "application/xslt+xml",
".mxml": "application/xv+xml",
".xhvml": "application/xv+xml",
".xvml": "application/xv+xml",
".xvm": "application/xv+xml",
".yang": "application/yang",
".yin": "application/yin+xml",
".zip": "application/zip",
".726": "audio/32kadpcm",
".ac3": "audio/ac3",
".amr": "audio/AMR",
".awb": "audio/AMR-WB",
".acn": "audio/asc",
".aal": "audio/ATRAC-ADVANCED-LOSSLESS",
".atx": "audio/ATRAC-X",
".at3": "audio/ATRAC3",
".aa3": "audio/ATRAC3",
".omg": "audio/ATRAC3",
".au": "audio/basic",
".snd": "audio/basic",
".dls": "audio/dls",
".evc": "audio/EVRC",
".evb": "audio/EVRCB",
".enw": "audio/EVRCNW",
".evw": "audio/EVRCWB",
".lbc": "audio/iLBC",
".l16": "audio/L16",
".mxmf": "audio/mobile-xmf",
".m4a": "audio/mp4",
".mp3": "audio/mpeg",
".mpga": "audio/mpeg",
".mp1": "audio/mpeg",
".mp2": "audio/mpeg",
".oga": "audio/ogg",
".ogg": "audio/ogg",
".opus": "audio/ogg",
".spx": "audio/ogg",
".sid": "audio/prs.sid",
".psid": "audio/prs.sid",
".qcp": "audio/qcelp",
".smv": "audio/SMV",
".koz": "audio/vnd.audikoz",
".uva": "audio/vnd.dece.audio",
".uvva": "audio/vnd.dece.audio",
".eol": "audio/vnd.digital-winds",
".mlp": "audio/vnd.dolby.mlp",
".dts": "audio/vnd.dts",
".dtshd": "audio/vnd.dts.hd",
".plj": "audio/vnd.everad.plj",
".lvp": "audio/vnd.lucent.voice",
".pya": "audio/vnd.ms-playready.media.pya",
".vbk": "audio/vnd.nortel.vbk",
".ecelp4800": "audio/vnd.nuera.ecelp4800",
".ecelp7470": "audio/vnd.nuera.ecelp7470",
".ecelp9600": "audio/vnd.nuera.ecelp9600",
".rip": "audio/vnd.rip",
".smp3": "audio/vnd.sealedmedia.softseal.mpeg",
".smp": "audio/vnd.sealedmedia.softseal.mpeg",
".s1m": "audio/vnd.sealedmedia.softseal.mpeg",
".ttc": "font/collection",
".otf": "font/otf",
".ttf": "font/ttf",
".woff": "font/woff",
".woff2": "font/woff2",
".bmp": "image/bmp",
".dib": "image/bmp",
".cgm": "image/cgm",
".drle": "image/dicom-rle",
".emf": "image/emf",
".fits": "image/fits",
".fit": "image/fits",
".fts": "image/fits",
".gif": "image/gif",
".ief": "image/ief",
".jls": "image/jls",
".jp2": "image/jp2",
".jpg2": "image/jp2",
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".jpe": "image/jpeg",
".jfif": "image/jpeg",
".jpm": "image/jpm",
".jpgm": "image/jpm",
".jpx": "image/jpx",
".jpf": "image/jpx",
".ktx": "image/ktx",
".png": "image/png",
".btif": "image/prs.btif",
".btf": "image/prs.btif",
".pti": "image/prs.pti",
".svg": "image/svg+xml",
".svgz": "image/svg+xml",
".t38": "image/t38",
".tiff": "image/tiff",
".tif": "image/tiff",
".tfx": "image/tiff-fx",
".psd": "image/vnd.adobe.photoshop",
".azv": "image/vnd.airzip.accelerator.azv",
".uvi": "image/vnd.dece.graphic",
".uvvi": "image/vnd.dece.graphic",
".uvg": "image/vnd.dece.graphic",
".uvvg": "image/vnd.dece.graphic",
".djvu": "image/vnd.djvu",
".djv": "image/vnd.djvu",
".dwg": "image/vnd.dwg",
".dxf": "image/vnd.dxf",
".fbs": "image/vnd.fastbidsheet",
".fpx": "image/vnd.fpx",
".fst": "image/vnd.fst",
".mmr": "image/vnd.fujixerox.edmics-mmr",
".rlc": "image/vnd.fujixerox.edmics-rlc",
".pgb": "image/vnd.globalgraphics.pgb",
".ico": "image/vnd.microsoft.icon",
".apng": "image/vnd.mozilla.apng",
".mdi": "image/vnd.ms-modi",
".hdr": "image/vnd.radiance",
".rgbe": "image/vnd.radiance",
".xyze": "image/vnd.radiance",
".spng": "image/vnd.sealed.png",
".spn": "image/vnd.sealed.png",
".s1n": "image/vnd.sealed.png",
".sgif": "image/vnd.sealedmedia.softseal.gif",
".sgi": "image/vnd.sealedmedia.softseal.gif",
".s1g": "image/vnd.sealedmedia.softseal.gif",
".sjpg": "image/vnd.sealedmedia.softseal.jpg",
".sjp": "image/vnd.sealedmedia.softseal.jpg",
".s1j": "image/vnd.sealedmedia.softseal.jpg",
".tap": "image/vnd.tencent.tap",
".vtf": "image/vnd.valve.source.texture",
".wbmp": "image/vnd.wap.wbmp",
".xif": "image/vnd.xiff",
".pcx": "image/vnd.zbrush.pcx",
".wmf": "image/wmf",
".u8msg": "message/global",
".u8dsn": "message/global-delivery-status",
".u8mdn": "message/global-disposition-notification",
".u8hdr": "message/global-headers",
".eml": "message/rfc822",
".mail": "message/rfc822",
".art": "message/rfc822",
".gltf": "model/gltf+json",
".igs": "model/iges",
".iges": "model/iges",
".msh": "model/mesh",
".mesh": "model/mesh",
".silo": "model/mesh",
".dae": "model/vnd.collada+xml",
".dwf": "model/vnd.dwf",
".gdl": "model/vnd.gdl",
".gsm": "model/vnd.gdl",
".win": "model/vnd.gdl",
".dor": "model/vnd.gdl",
".lmp": "model/vnd.gdl",
".rsm": "model/vnd.gdl",
".msm": "model/vnd.gdl",
".ism": "model/vnd.gdl",
".gtw": "model/vnd.gtw",
".moml": "model/vnd.moml+xml",
".mts": "model/vnd.mts",
".ogex": "model/vnd.opengex",
".x_b": "model/vnd.parasolid.transmit.binary",
".xmt_bin": "model/vnd.parasolid.transmit.binary",
".x_t": "model/vnd.parasolid.transmit.text",
".xmt_txt": "model/vnd.parasolid.transmit.text",
".bsp": "model/vnd.valve.source.compiled-map",
".vtu": "model/vnd.vtu",
".wrl": "model/vrml",
".vrml": "model/vrml",
".x3db": "model/x3d+xml",
".x3dv": "model/x3d-vrml",
".x3dvz": "model/x3d-vrml",
".bmed": "multipart/vnd.bint.med-plus",
".vpm": "multipart/voice-message",
".appcache": "text/cache-manifest",
".manifest": "text/cache-manifest",
".ics": "text/calendar",
".ifb": "text/calendar",
".css": "text/css",
".csv": "text/csv",
".csvs": "text/csv-schema",
".soa": "text/dns",
".zone": "text/dns",
".html": "text/html",
".htm": "text/html",
".cnd": "text/jcr-cnd",
".markdown": "text/markdown",
".md": "text/markdown",
".miz": "text/mizar",
".n3": "text/n3",
".txt": "text/plain",
".asc": "text/plain",
".text": "text/plain",
".pm": "text/plain",
".el": "text/plain",
".c": "text/plain",
".h": "text/plain",
".cc": "text/plain",
".hh": "text/plain",
".cxx": "text/plain",
".hxx": "text/plain",
".f90": "text/plain",
".conf": "text/plain",
".log": "text/plain",
".provn": "text/provenance-notation",
".rst": "text/prs.fallenstein.rst",
".tag": "text/prs.lines.tag",
".dsc": "text/prs.lines.tag",
".rtx": "text/richtext",
".sgml": "text/sgml",
".sgm": "text/sgml",
".tsv": "text/tab-separated-values",
".t": "text/troff",
".tr": "text/troff",
".roff": "text/troff",
".ttl": "text/turtle",
".uris": "text/uri-list",
".uri": "text/uri-list",
".vcf": "text/vcard",
".vcard": "text/vcard",
".a": "text/vnd.a",
".abc": "text/vnd.abc",
".ascii": "text/vnd.ascii-art",
".copyright": "text/vnd.debian.copyright",
".dms": "text/vnd.DMClientScript",
".sub": "text/vnd.dvb.subtitle",
".jtd": "text/vnd.esmertec.theme-descriptor",
".fly": "text/vnd.fly",
".flx": "text/vnd.fmi.flexstor",
".gv": "text/vnd.graphviz",
".dot": "text/vnd.graphviz",
".3dml": "text/vnd.in3d.3dml",
".3dm": "text/vnd.in3d.3dml",
".spot": "text/vnd.in3d.spot",
".spo": "text/vnd.in3d.spot",
".mpf": "text/vnd.ms-mediapackage",
".ccc": "text/vnd.net2phone.commcenter.command",
".uric": "text/vnd.si.uricatalogue",
".jad": "text/vnd.sun.j2me.app-descriptor",
".ts": "text/vnd.trolltech.linguist",
".si": "text/vnd.wap.si",
".sl": "text/vnd.wap.sl",
".wml": "text/vnd.wap.wml",
".wmls": "text/vnd.wap.wmlscript",
".xml": "text/xml",
".xsd": "text/xml",
".rng": "text/xml",
".ent": "text/xml-external-parsed-entity",
".3gp": "video/3gpp",
".3gpp": "video/3gpp",
".3g2": "video/3gpp2",
".3gpp2": "video/3gpp2",
".m4s": "video/iso.segment",
".mj2": "video/mj2",
".mjp2": "video/mj2",
".mp4": "video/mp4",
".mpg4": "video/mp4",
".m4v": "video/mp4",
".mpeg": "video/mpeg",
".mpg": "video/mpeg",
".mpe": "video/mpeg",
".m1v": "video/mpeg",
".m2v": "video/mpeg",
".ogv": "video/ogg",
".mov": "video/quicktime",
".qt": "video/quicktime",
".uvh": "video/vnd.dece.hd",
".uvvh": "video/vnd.dece.hd",
".uvm": "video/vnd.dece.mobile",
".uvvm": "video/vnd.dece.mobile",
".uvu": "video/vnd.dece.mp4",
".uvvu": "video/vnd.dece.mp4",
".uvp": "video/vnd.dece.pd",
".uvvp": "video/vnd.dece.pd",
".uvs": "video/vnd.dece.sd",
".uvvs": "video/vnd.dece.sd",
".uvv": "video/vnd.dece.video",
".uvvv": "video/vnd.dece.video",
".dvb": "video/vnd.dvb.file",
".fvt": "video/vnd.fvt",
".mxu": "video/vnd.mpegurl",
".m4u": "video/vnd.mpegurl",
".pyv": "video/vnd.ms-playready.media.pyv",
".nim": "video/vnd.nokia.interleaved-multimedia",
".bik": "video/vnd.radgamettools.bink",
".bk2": "video/vnd.radgamettools.bink",
".smk": "video/vnd.radgamettools.smacker",
".smpg": "video/vnd.sealed.mpeg1",
".s11": "video/vnd.sealed.mpeg1",
".s14": "video/vnd.sealed.mpeg4",
".sswf": "video/vnd.sealed.swf",
".ssw": "video/vnd.sealed.swf",
".smov": "video/vnd.sealedmedia.softseal.mov",
".smo": "video/vnd.sealedmedia.softseal.mov",
".s1q": "video/vnd.sealedmedia.softseal.mov",
".viv": "video/vnd.vivo",
".cpt": "application/mac-compactpro",
".metalink": "application/metalink+xml",
".owx": "application/owl+xml",
".rss": "application/rss+xml",
".apk": "application/vnd.android.package-archive",
".dd": "application/vnd.oma.dd+xml",
".dcf": "application/vnd.oma.drm.content",
".o4a": "application/vnd.oma.drm.dcf",
".o4v": "application/vnd.oma.drm.dcf",
".dm": "application/vnd.oma.drm.message",
".drc": "application/vnd.oma.drm.rights+wbxml",
".dr": "application/vnd.oma.drm.rights+xml",
".sxc": "application/vnd.sun.xml.calc",
".stc": "application/vnd.sun.xml.calc.template",
".sxd": "application/vnd.sun.xml.draw",
".std": "application/vnd.sun.xml.draw.template",
".sxi": "application/vnd.sun.xml.impress",
".sti": "application/vnd.sun.xml.impress.template",
".sxm": "application/vnd.sun.xml.math",
".sxw": "application/vnd.sun.xml.writer",
".sxg": "application/vnd.sun.xml.writer.global",
".stw": "application/vnd.sun.xml.writer.template",
".sis": "application/vnd.symbian.install",
".mms": "application/vnd.wap.mms-message",
".anx": "application/x-annodex",
".bcpio": "application/x-bcpio",
".torrent": "application/x-bittorrent",
".bz2": "application/x-bzip2",
".vcd": "application/x-cdlink",
".crx": "application/x-chrome-extension",
".cpio": "application/x-cpio",
".csh": "application/x-csh",
".dcr": "application/x-director",
".dir": "application/x-director",
".dxr": "application/x-director",
".dvi": "application/x-dvi",
".spl": "application/x-futuresplash",
".gtar": "application/x-gtar",
".hdf": "application/x-hdf",
".jar": "application/x-java-archive",
".jnlp": "application/x-java-jnlp-file",
".pack": "application/x-java-pack200",
".kil": "application/x-killustrator",
".latex": "application/x-latex",
".nc": "application/x-netcdf",
".cdf": "application/x-netcdf",
".pl": "application/x-perl",
".rpm": "application/x-rpm",
".sh": "application/x-sh",
".shar": "application/x-shar",
".sit": "application/x-stuffit",
".sv4cpio": "application/x-sv4cpio",
".sv4crc": "application/x-sv4crc",
".tar": "application/x-tar",
".tcl": "application/x-tcl",
".tex": "application/x-tex",
".texinfo": "application/x-texinfo",
".texi": "application/x-texinfo",
".man": "application/x-troff-man",
".1": "application/x-troff-man",
".2": "application/x-troff-man",
".3": "application/x-troff-man",
".4": "application/x-troff-man",
".5": "application/x-troff-man",
".6": "application/x-troff-man",
".7": "application/x-troff-man",
".8": "application/x-troff-man",
".me": "application/x-troff-me",
".ms": "application/x-troff-ms",
".ustar": "application/x-ustar",
".src": "application/x-wais-source",
".xpi": "application/x-xpinstall",
".xspf": "application/x-xspf+xml",
".xz": "application/x-xz",
".mid": "audio/midi",
".midi": "audio/midi",
".kar": "audio/midi",
".aif": "audio/x-aiff",
".aiff": "audio/x-aiff",
".aifc": "audio/x-aiff",
".axa": "audio/x-annodex",
".flac": "audio/x-flac",
".mka": "audio/x-matroska",
".mod": "audio/x-mod",
".ult": "audio/x-mod",
".uni": "audio/x-mod",
".m15": "audio/x-mod",
".mtm": "audio/x-mod",
".669": "audio/x-mod",
".med": "audio/x-mod",
".m3u": "audio/x-mpegurl",
".wax": "audio/x-ms-wax",
".wma": "audio/x-ms-wma",
".ram": "audio/x-pn-realaudio",
".rm": "audio/x-pn-realaudio",
".ra": "audio/x-realaudio",
".s3m": "audio/x-s3m",
".stm": "audio/x-stm",
".wav": "audio/x-wav",
".xyz": "chemical/x-xyz",
".webp": "image/webp",
".ras": "image/x-cmu-raster",
".pnm": "image/x-portable-anymap",
".pbm": "image/x-portable-bitmap",
".pgm": "image/x-portable-graymap",
".ppm": "image/x-portable-pixmap",
".rgb": "image/x-rgb",
".tga": "image/x-targa",
".xbm": "image/x-xbitmap",
".xpm": "image/x-xpixmap",
".xwd": "image/x-xwindowdump",
".sandboxed": "text/html-sandboxed",
".pod": "text/x-pod",
".etx": "text/x-setext",
".webm": "video/webm",
".axv": "video/x-annodex",
".flv": "video/x-flv",
".fxm": "video/x-javafx",
".mkv": "video/x-matroska",
".mk3d": "video/x-matroska-3d",
".asx": "video/x-ms-asf",
".wm": "video/x-ms-wm",
".wmv": "video/x-ms-wmv",
".wmx": "video/x-ms-wmx",
".wvx": "video/x-ms-wvx",
".avi": "video/x-msvideo",
".movie": "video/x-sgi-movie",
".ice": "x-conference/x-cooltalk",
".sisx": "x-epoc/x-sisx-app",
}
for ext, name := range mimeTypes {
if err := mime.AddExtensionType(ext, name); err != nil {
panic(err)
}
}
}
......@@ -201,6 +201,13 @@ func (s *Server) HandleBzzGet(w http.ResponseWriter, r *http.Request) {
defer reader.Close()
w.Header().Set("Content-Type", "application/x-tar")
fileName := uri.Addr
if found := path.Base(uri.Path); found != "" && found != "." && found != "/" {
fileName = found
}
w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename=\"%s.tar\"", fileName))
w.WriteHeader(http.StatusOK)
io.Copy(w, reader)
return
......@@ -616,7 +623,7 @@ func (s *Server) HandleGetResource(w http.ResponseWriter, r *http.Request) {
// All ok, serve the retrieved update
log.Debug("Found update", "view", view.Hex(), "ruid", ruid)
w.Header().Set("Content-Type", "application/octet-stream")
w.Header().Set("Content-Type", api.MimeOctetStream)
http.ServeContent(w, r, "", time.Now(), bytes.NewReader(data))
}
......@@ -690,11 +697,9 @@ func (s *Server) HandleGet(w http.ResponseWriter, r *http.Request) {
case uri.Raw():
// allow the request to overwrite the content type using a query
// parameter
contentType := "application/octet-stream"
if typ := r.URL.Query().Get("content_type"); typ != "" {
contentType = typ
w.Header().Set("Content-Type", typ)
}
w.Header().Set("Content-Type", contentType)
http.ServeContent(w, r, "", time.Now(), reader)
case uri.Hash():
w.Header().Set("Content-Type", "text/plain")
......@@ -850,8 +855,17 @@ func (s *Server) HandleGetFile(w http.ResponseWriter, r *http.Request) {
return
}
w.Header().Set("Content-Type", contentType)
http.ServeContent(w, r, "", time.Now(), newBufferedReadSeeker(reader, getFileBufferSize))
if contentType != "" {
w.Header().Set("Content-Type", contentType)
}
fileName := uri.Addr
if found := path.Base(uri.Path); found != "" && found != "." && found != "/" {
fileName = found
}
w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename=\"%s\"", fileName))
http.ServeContent(w, r, fileName, time.Now(), newBufferedReadSeeker(reader, getFileBufferSize))
}
// The size of buffer used for bufio.Reader on LazyChunkReader passed to
......
......@@ -32,6 +32,7 @@ import (
"net/http"
"net/url"
"os"
"path"
"strconv"
"strings"
"testing"
......@@ -764,6 +765,16 @@ func testBzzTar(encrypted bool, t *testing.T) {
}
defer resp2.Body.Close()
if h := resp2.Header.Get("Content-Type"); h != "application/x-tar" {
t.Fatalf("Content-Type header expected: application/x-tar, got: %s", h)
}
expectedFileName := string(swarmHash) + ".tar"
expectedContentDisposition := fmt.Sprintf("inline; filename=\"%s\"", expectedFileName)
if h := resp2.Header.Get("Content-Disposition"); h != expectedContentDisposition {
t.Fatalf("Content-Disposition header expected: %s, got: %s", expectedContentDisposition, h)
}
file, err := ioutil.TempFile("", "swarm-downloaded-tarball")
if err != nil {
t.Fatal(err)
......@@ -1099,7 +1110,7 @@ func TestModify(t *testing.T) {
res, body := httpDo(testCase.method, testCase.uri, reqBody, testCase.headers, testCase.verbose, t)
if res.StatusCode != testCase.expectedStatusCode {
t.Fatalf("expected status code %d but got %d", testCase.expectedStatusCode, res.StatusCode)
t.Fatalf("expected status code %d but got %d, %s", testCase.expectedStatusCode, res.StatusCode, body)
}
if testCase.assertResponseBody != "" && !strings.Contains(body, testCase.assertResponseBody) {
t.Log(body)
......@@ -1210,19 +1221,25 @@ func TestBzzGetFileWithResolver(t *testing.T) {
hash := common.HexToHash(string(swarmHash))
resolver.hash = &hash
for _, v := range []struct {
addr string
path string
expectedStatusCode int
addr string
path string
expectedStatusCode int
expectedContentType string
expectedFileName string
}{
{
addr: string(swarmHash),
path: fileNames[0],
expectedStatusCode: http.StatusOK,
addr: string(swarmHash),
path: fileNames[0],
expectedStatusCode: http.StatusOK,
expectedContentType: "text/plain",
expectedFileName: path.Base(fileNames[0]),
},
{
addr: "somebogusensname",
path: fileNames[0],
expectedStatusCode: http.StatusOK,
addr: "somebogusensname",
path: fileNames[0],
expectedStatusCode: http.StatusOK,
expectedContentType: "text/plain",
expectedFileName: path.Base(fileNames[0]),
},
} {
req, err := http.NewRequest("GET", fmt.Sprintf(srv.URL+"/bzz:/%s/%s", v.addr, v.path), nil)
......@@ -1237,6 +1254,16 @@ func TestBzzGetFileWithResolver(t *testing.T) {
if serverResponse.StatusCode != v.expectedStatusCode {
t.Fatalf("expected %d, got %d", v.expectedStatusCode, serverResponse.StatusCode)
}
if h := serverResponse.Header.Get("Content-Type"); h != v.expectedContentType {
t.Fatalf("Content-Type header expected: %s, got %s", v.expectedContentType, h)
}
expectedContentDisposition := fmt.Sprintf("inline; filename=\"%s\"", v.expectedFileName)
if h := serverResponse.Header.Get("Content-Disposition"); h != expectedContentDisposition {
t.Fatalf("Content-Disposition header expected: %s, got: %s", expectedContentDisposition, h)
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment