mirror of https://github.com/ethereum/go-ethereum
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 suppressedpull/17800/head
parent
b69942befe
commit
dc5d643bb5
@ -0,0 +1,124 @@ |
||||
// 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) |
||||
} |
||||
} |
||||
} |
||||
` |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue