Skip to content

Instantly share code, notes, and snippets.

@eldondev
Last active August 29, 2015 14:08
Show Gist options
  • Save eldondev/45cb0128fb36a89894c8 to your computer and use it in GitHub Desktop.
Save eldondev/45cb0128fb36a89894c8 to your computer and use it in GitHub Desktop.
A funky/stupid "web proxy" written in go with leveldb

I was interested in writing a little something that I could put in from of wget -m that would ensure that wget would not re-fetch files, even if those files had disappeared from the local host

package main
import (
"bufio"
"io"
"log"
"net"
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/opt"
"fmt"
"net/url"
"strings"
"bytes"
)
func main() {
l, err := net.Listen("tcp", ":2000")
if err != nil {
log.Fatal(err)
}
db, err := leveldb.OpenFile("db/", nil)
defer db.Close()
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
log.Fatal(err)
}
go func(c net.Conn) {
var out bytes.Buffer
buf := bufio.NewReader(c)
getline, _ := buf.ReadString('\n')
url, err := url.Parse(strings.Split(getline, " ")[1])
get_path := strings.SplitN(getline, url.Host, 2)[1]
val, err := db.Get([]byte(getline), nil )
if err != nil {
fmt.Printf("Fetching line : %s", getline);
if strings.Index(url.Host, ":") < 0 {
url.Host += ":80"
}
sc, err := net.Dial("tcp", url.Host)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(sc, "GET %s", get_path);
write_resp := io.MultiWriter(c, bufio.NewWriter(&out));
go func() { fmt.Printf("Starting copy req\n") ;io.Copy(sc, buf) ; fmt.Printf("done copy req\n")}()
fmt.Printf("Starting copy resp\n") ; io.Copy(write_resp, sc) ; fmt.Printf("done copy res\n")
var sync opt.WriteOptions;
sync.Sync = true;
err = db.Put([]byte(getline),[]byte("HTTP/1.1 404 Not Found\n\n"), &sync)
} else {
fmt.Printf("Serving from cache : %s", getline);
io.Copy(c, bytes.NewReader(val))
c.Close()
}
}(conn)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment