func (config *Config) InstallHandlers(hi HandlerInstaller, baseURL string) (outerr os.Error) { defer func() { err := recover() if err == nil { return } outerr = fmt.Errorf("%v", err) }() auth.AccessPassword = config.OptionalString("password", "") if url := config.OptionalString("baseURL", ""); url != "" { baseURL = url } prefixes := config.RequiredObject("prefixes") if err := config.Validate(); err != nil { return fmt.Errorf("configuration error in root object's keys: %v", err) } hl := &handlerLoader{ installer: hi, baseURL: baseURL, config: make(map[string]*handlerConfig), handler: make(map[string]interface{}), } for prefix, vei := range prefixes { if !strings.HasPrefix(prefix, "/") { exitFailure("prefix %q doesn't start with /", prefix) } if !strings.HasSuffix(prefix, "/") { exitFailure("prefix %q doesn't end with /", prefix) } pmap, ok := vei.(map[string]interface{}) if !ok { exitFailure("prefix %q value is a %T, not an object", prefix, vei) } pconf := jsonconfig.Obj(pmap) enabled := pconf.OptionalBool("enabled", true) if !enabled { continue } handlerType := pconf.RequiredString("handler") handlerArgs := pconf.OptionalObject("handlerArgs") if err := pconf.Validate(); err != nil { exitFailure("configuration error in prefix %s: %v", prefix, err) } h := &handlerConfig{ prefix: prefix, htype: handlerType, conf: handlerArgs, } hl.config[prefix] = h if handlerType == "ui" { config.UIPath = prefix } } hl.setupAll() return nil }
func buildStorageForReceive(ld blobserver.Loader, confOrString interface{}) (storageFunc, os.Error) { // Static configuration from a string if s, ok := confOrString.(string); ok { sto, err := ld.GetStorage(s) if err != nil { return nil, err } f := func(io.Reader) (blobserver.Storage, []byte, os.Error) { return sto, nil, nil } return f, nil } conf := jsonconfig.Obj(confOrString.(map[string]interface{})) ifStr := conf.RequiredString("if") // TODO: let 'then' and 'else' point to not just strings but either // a string or a JSON object with another condition, and then // call buildStorageForReceive on it recursively thenTarget := conf.RequiredString("then") elseTarget := conf.RequiredString("else") if err := conf.Validate(); err != nil { return nil, err } thenSto, err := ld.GetStorage(thenTarget) if err != nil { return nil, err } elseSto, err := ld.GetStorage(elseTarget) if err != nil { return nil, err } switch ifStr { case "isSchema": return isSchemaPicker(thenSto, elseSto), nil } return nil, fmt.Errorf("cond: unsupported 'if' type of %q", ifStr) }
func main() { flag.Parse() configPath := *flagConfigFile if !filepath.IsAbs(configPath) { configPath = filepath.Join(osutil.CamliConfigDir(), configPath) } f, err := os.Open(configPath) if err != nil { exitFailure("error opening %s: %v", configPath, err) } defer f.Close() dj := json.NewDecoder(f) rootjson := make(map[string]interface{}) if err = dj.Decode(&rootjson); err != nil { extra := "" if serr, ok := err.(*json.SyntaxError); ok { if _, serr := f.Seek(0, os.SEEK_SET); serr != nil { log.Fatalf("seek error: %v", serr) } line, col, highlight := errorutil.HighlightBytePosition(f, serr.Offset) extra = fmt.Sprintf(":\nError at line %d, column %d (file offset %d):\n%s", line, col, serr.Offset, highlight) } exitFailure("error parsing JSON object in config file %s%s\n%v", osutil.UserServerConfigPath(), extra, err) } if err := jsonconfig.EvaluateExpressions(rootjson); err != nil { exitFailure("error expanding JSON config expressions in %s: %v", configPath, err) } ws := webserver.New() baseURL := ws.BaseURL() // Root configuration config := jsonconfig.Obj(rootjson) { cert, key := config.OptionalString("TLSCertFile", ""), config.OptionalString("TLSKeyFile", "") if (cert != "") != (key != "") { exitFailure("TLSCertFile and TLSKeyFile must both be either present or absent") } if cert != "" { ws.SetTLS(cert, key) } } auth.AccessPassword = config.OptionalString("password", "") if url := config.OptionalString("baseURL", ""); url != "" { baseURL = url } prefixes := config.RequiredObject("prefixes") if err := config.Validate(); err != nil { exitFailure("configuration error in root object's keys in %s: %v", configPath, err) } hl := &handlerLoader{ ws: ws, baseURL: baseURL, config: make(map[string]*handlerConfig), handler: make(map[string]interface{}), } for prefix, vei := range prefixes { if !strings.HasPrefix(prefix, "/") { exitFailure("prefix %q doesn't start with /", prefix) } if !strings.HasSuffix(prefix, "/") { exitFailure("prefix %q doesn't end with /", prefix) } pmap, ok := vei.(map[string]interface{}) if !ok { exitFailure("prefix %q value isn't an object", prefix) } pconf := jsonconfig.Obj(pmap) handlerType := pconf.RequiredString("handler") handlerArgs := pconf.OptionalObject("handlerArgs") if err := pconf.Validate(); err != nil { exitFailure("configuration error in prefix %s: %v", prefix, err) } h := &handlerConfig{ prefix: prefix, htype: handlerType, conf: handlerArgs, } hl.config[prefix] = h } hl.setupAll() ws.Serve() }