|
- // Copyright 2013 The Go Authors. All rights reserved.
- //
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file or at
- // https://developers.google.com/open-source/licenses/bsd.
-
- package main
-
- import (
- "fmt"
- "io/ioutil"
- "net/http"
- "regexp"
- "strings"
-
- "github.com/golang/gddo/doc"
- )
-
- func findExamples(pdoc *doc.Package, export, method string) []*doc.Example {
- if "package" == export {
- return pdoc.Examples
- }
- for _, f := range pdoc.Funcs {
- if f.Name == export {
- return f.Examples
- }
- }
- for _, t := range pdoc.Types {
- for _, f := range t.Funcs {
- if f.Name == export {
- return f.Examples
- }
- }
- if t.Name == export {
- if method == "" {
- return t.Examples
- }
- for _, m := range t.Methods {
- if method == m.Name {
- return m.Examples
- }
- }
- return nil
- }
- }
- return nil
- }
-
- func findExample(pdoc *doc.Package, export, method, name string) *doc.Example {
- for _, e := range findExamples(pdoc, export, method) {
- if name == e.Name {
- return e
- }
- }
- return nil
- }
-
- var exampleIDPat = regexp.MustCompile(`([^-]+)(?:-([^-]*)(?:-(.*))?)?`)
-
- func playURL(pdoc *doc.Package, id, countryHeader string) (string, error) {
- if m := exampleIDPat.FindStringSubmatch(id); m != nil {
- if e := findExample(pdoc, m[1], m[2], m[3]); e != nil && e.Play != "" {
- req, err := http.NewRequest("POST", "https://play.golang.org/share", strings.NewReader(e.Play))
- if err != nil {
- return "", err
- }
- req.Header.Set("Content-Type", "text/plain")
- if countryHeader != "" {
- // Forward the App Engine country header.
- req.Header.Set("X-AppEngine-Country", countryHeader)
- }
- resp, err := httpClient.Do(req)
- if err != nil {
- return "", err
- }
- defer resp.Body.Close()
- p, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return "", err
- }
- if resp.StatusCode > 399 {
- return "", &httpError{
- status: resp.StatusCode,
- err: fmt.Errorf("Error from play.golang.org: %s", p),
- }
- }
- return fmt.Sprintf("http://play.golang.org/p/%s", p), nil
- }
- }
- return "", &httpError{status: http.StatusNotFound}
- }
|