gopkg.in/simversity/gottp.v3@v3.0.0-20160401065405-576cf030ca0e/urls.go (about)

     1  package gottp
     2  
     3  import (
     4  	"log"
     5  	"net/http"
     6  	"regexp"
     7  )
     8  
     9  type Url struct {
    10  	name    string
    11  	url     string
    12  	handler Handler
    13  	pattern *regexp.Regexp
    14  }
    15  
    16  var boundUrls = []*Url{}
    17  
    18  func NewUrl(name string, pattern string, handler Handler) {
    19  	compiled_pattern, err := regexp.Compile(pattern)
    20  	if err != nil {
    21  		panic(err)
    22  	}
    23  
    24  	url := Url{
    25  		name:    name,
    26  		handler: handler,
    27  		pattern: compiled_pattern,
    28  		url:     pattern,
    29  	}
    30  
    31  	boundUrls = append(boundUrls, &url)
    32  }
    33  
    34  func (u Url) MakeUrlArgs(url *string) (*map[string]string, bool) {
    35  	matches := u.pattern.FindStringSubmatch(*url)
    36  	named_groups := u.pattern.SubexpNames()
    37  	data := map[string]string{}
    38  
    39  	var err bool
    40  
    41  	if len(matches) > 0 {
    42  		for ix, key := range named_groups {
    43  			if len(key) > 0 {
    44  				data[key] = matches[ix]
    45  			}
    46  		}
    47  	} else if len(named_groups) > 0 {
    48  		err = true
    49  	}
    50  
    51  	return &data, err
    52  }
    53  
    54  func bindGlobalHandler() {
    55  	http.HandleFunc("/", GlobalHandler)
    56  }
    57  
    58  func bindHandlers() {
    59  	NewUrl("async_pipe", "^/async_pipe/?$", new(AsyncPipeHandler))
    60  	NewUrl("pipe", "^/pipe/?$", new(PipeHandler))
    61  	NewUrl("urls", "^/urls/?$", new(UrlHandler))
    62  }
    63  
    64  func init() {
    65  	log.SetFlags(log.Lshortfile | log.Ldate | log.Ltime)
    66  	bindGlobalHandler()
    67  	bindHandlers()
    68  }