tos.go (2958B)
1 package tos 2 3 import ( 4 "fmt" 5 "log" 6 "mime" 7 "net/http" 8 "os" 9 10 "golang.org/x/text/language" 11 ) 12 13 type TalerTosConfig struct { 14 // The default file type 15 DefaultFileType string 16 17 // Supported file types 18 SupportedFileTypes []string 19 20 // Default language 21 DefaultLanguage string 22 } 23 24 func ServiceTermsResponse(w http.ResponseWriter, r *http.Request, termsdatahome string, cfg TalerTosConfig) { 25 fileType := cfg.DefaultFileType 26 termsLocation := termsdatahome 27 for _, typ := range r.Header["Accept"] { 28 for _, a := range cfg.SupportedFileTypes { 29 if typ == a { 30 fileType = a 31 } 32 } 33 } 34 35 if len(r.Header.Get("Accept-Language")) != 0 { 36 acceptLangs, _, _ := language.ParseAcceptLanguage(r.Header.Get("Accept-Language")) 37 for _, lang := range acceptLangs { 38 extensions, _ := mime.ExtensionsByType(fileType) 39 for _, ext := range extensions { 40 docFile := fmt.Sprintf("%s/%s/0%s", termsLocation, lang.String(), ext) 41 log.Printf("Trying %s\n", docFile) 42 fileBytes, err := os.ReadFile(docFile) 43 if nil == err { 44 w.Header().Set("Content-Type", fileType) 45 w.Write(fileBytes) 46 return 47 } 48 } 49 } 50 } 51 // Default document in expected/default format 52 defaultLanguage := cfg.DefaultLanguage 53 extensions, _ := mime.ExtensionsByType(fileType) 54 for _, ext := range extensions { 55 docFile := fmt.Sprintf("%s/%s/0%s", termsLocation, defaultLanguage, ext) 56 log.Println("Trying " + docFile) 57 fileBytes, err := os.ReadFile(docFile) 58 if nil == err { 59 w.Header().Set("Content-Type", fileType) 60 w.Write(fileBytes) 61 return 62 } 63 } 64 w.WriteHeader(http.StatusNotFound) 65 } 66 67 68 func PrivacyPolicyResponse(w http.ResponseWriter, r *http.Request, policydatahome string, cfg TalerTosConfig) { 69 fileType := cfg.DefaultFileType 70 termsLocation := policydatahome 71 for _, typ := range r.Header["Accept"] { 72 for _, a := range cfg.SupportedFileTypes { 73 if typ == a { 74 fileType = a 75 } 76 } 77 } 78 79 if len(r.Header.Get("Accept-Language")) != 0 { 80 acceptLangs, _, _ := language.ParseAcceptLanguage(r.Header.Get("Accept-Language")) 81 for _, lang := range acceptLangs { 82 extensions, _ := mime.ExtensionsByType(fileType) 83 for _, ext := range extensions { 84 docFile := fmt.Sprintf("%s/%s/0%s", termsLocation, lang.String(), ext) 85 log.Printf("Trying %s\n", docFile) 86 fileBytes, err := os.ReadFile(docFile) 87 if nil == err { 88 w.Header().Set("Content-Type", fileType) 89 w.Write(fileBytes) 90 return 91 } 92 } 93 } 94 } 95 // Default document in expected/default format 96 defaultLanguage := cfg.DefaultLanguage 97 extensions, _ := mime.ExtensionsByType(fileType) 98 for _, ext := range extensions { 99 docFile := fmt.Sprintf("%s/%s/0%s", termsLocation, defaultLanguage, ext) 100 fileBytes, err := os.ReadFile(docFile) 101 if nil == err { 102 w.Header().Set("Content-Type", fileType) 103 w.Write(fileBytes) 104 return 105 } 106 } 107 w.WriteHeader(http.StatusNotFound) 108 }