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
Last active
August 29, 2015 14:08
-
-
Save eldondev/45cb0128fb36a89894c8 to your computer and use it in GitHub Desktop.
A funky/stupid "web proxy" written in go with leveldb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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