package helper import ( "crypto/rand" "fmt" "io" "io/ioutil" "log" "mime/multipart" "net" "net/http" "os" "path" ) // IP returns IP address from requester func IP(r *http.Request) (net.IP, error) { realip := r.Header.Get("x-forwarded-for") if realip != "" { return net.ParseIP(realip), nil } ip, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { return nil, err } return net.ParseIP(ip), nil } // Hostname returns hostname func Hostname(ip net.IP) ([]string, error) { names, err := net.LookupAddr(ip.String()) unknown := []string{"unknown host"} if err != nil { return unknown, err } if len(names) == 0 { return unknown, fmt.Errorf("unknown hostname for %v", ip.String()) } return names, nil } // File reads data from file func File(path string) ([]byte, error) { file, err := os.Open(path) if err != nil { log.Println("Error reading request. ", err) return nil, err } file.Close() byteValue, err := ioutil.ReadAll(file) if err != nil { log.Println(err) return nil, err } return byteValue, nil } // WriteFile Writes byte data to file func WriteFile(path string, data []byte) error { file, err := os.Create(path) if err != nil { return err } if _, err = file.Write(data); err != nil { file.Close() return err } err = file.Close() if err != nil { return err } return nil } // UploadFile Create file from multpart form func UploadFile(dir string, uuid uint64, file multipart.File, fileHeader *multipart.FileHeader) error { if _, err := os.Stat(dir); os.IsNotExist(err) { os.MkdirAll(dir, 0775) if err != nil { return err } } f, err := os.OpenFile(fmt.Sprintf("%v/%v%v", dir, uuid, path.Ext(fileHeader.Filename)), os.O_WRONLY|os.O_CREATE, 0666) if err != nil { f.Close() return err } defer f.Close() io.Copy(f, file) return nil } // GenKey Generates random 64 character string func GenKey() { key := make([]byte, 32) _, err := rand.Read(key) if err != nil { log.Fatal(err) } fmt.Printf("%x\n", key) } // GetContentType returns content mime type of file func GetContentType(file *os.File) (string, error) { buffer := make([]byte, 512) _, err := file.Read(buffer) if err != nil { return "", err } return http.DetectContentType(buffer), nil }