Initial Commit

This commit is contained in:
James Mills 2016-09-14 13:45:49 +10:00
commit a4cfebfbdf
No known key found for this signature in database
GPG Key ID: AC4C014F1440EBD6
6 changed files with 1438 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*~
*.bak
examples/hello/hello
examples/client/client
examples/fileserver/fileserver

60
README.md Normal file
View File

@ -0,0 +1,60 @@
# Gopher protocol library for Golang
This is a standards compliant Gopher library for the Go programming language
implementing the RFC 1436 specification. The library includes both client and
server handling and examples of each.
## Installation
$ go get github.com/prologic/go-gopher
## Usage
```#!go
import "github.com/prologic/go-gopher"
```
## Example
### Client
```#!go
package main
import (
"fmt"
"github.com/prologic/go-gopher"
)
func main() {
res, _ := gopher.Get("gopher://gopher.floodgap.com/")
bytes, _ = res.Dir.ToText()
fmt.Println(string(bytes))
}
```
### Server
```#!go
package main
import (
"log"
"github.com/prologic/go-gopher"
)
func hello(w gopher.ResponseWriter, r *gopher.Request) {
w.WriteInfo("Hello World!")
}
func main() {
gopher.HandleFunc("/hello", hello)
log.Fatal(gopher.ListenAndServe("localhost:70", nil))
}
```
## License
MIT

56
examples/client/main.go Normal file
View File

@ -0,0 +1,56 @@
package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
"github.com/prologic/go-gopher"
)
var (
json = flag.Bool("json", false, "display gopher directory as JSON")
)
func main() {
var uri string
flag.Parse()
if len(flag.Args()) == 1 {
uri = flag.Arg(0)
} else {
uri = "gopher://gopher.floodgap.com/"
}
res, err := gopher.Get(uri)
if err != nil {
log.Fatal(err)
}
if res.Body != nil {
contents, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
fmt.Print(contents)
} else {
var (
bytes []byte
err error
)
if *json {
bytes, err = res.Dir.ToJSON()
} else {
bytes, err = res.Dir.ToText()
}
if err != nil {
log.Fatal(err)
}
fmt.Println(string(bytes))
}
}

View File

@ -0,0 +1,29 @@
package main
import (
"flag"
"log"
"os"
"github.com/prologic/go-gopher"
)
func cwd() string {
dir, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
return dir
}
func main() {
var (
root = flag.String("root", cwd(), "root directory to serve")
)
flag.Parse()
gopher.Handle("/", gopher.FileServer(gopher.Dir(*root)))
log.Fatal(gopher.ListenAndServe("localhost:70", nil))
}

27
examples/hello/main.go Normal file
View File

@ -0,0 +1,27 @@
package main
import (
"log"
"github.com/prologic/go-gopher"
)
func index(w gopher.ResponseWriter, r *gopher.Request) {
w.WriteItem(
gopher.Item{
Type: gopher.FILE,
Selector: "/hello",
Description: "hello",
},
)
}
func hello(w gopher.ResponseWriter, r *gopher.Request) {
w.WriteInfo("Hello World!")
}
func main() {
gopher.HandleFunc("/", index)
gopher.HandleFunc("/hello", hello)
log.Fatal(gopher.ListenAndServe("localhost:70", nil))
}

1261
gopher.go Normal file

File diff suppressed because it is too large Load Diff