Best Go-testdeep code snippet using td.notFound
http.go
Source:http.go  
1package http2import (3	"bytes"4	"context"5	"errors"6	"fmt"7	"html"8	"io"9	"net"10	"net/http"11	"net/url"12	"os"13	"sort"14	"strconv"15	"strings"16	"time"17	"github.com/jech/storrent/alloc"18	"github.com/jech/storrent/config"19	"github.com/jech/storrent/dht"20	"github.com/jech/storrent/hash"21	"github.com/jech/storrent/known"22	"github.com/jech/storrent/path"23	"github.com/jech/storrent/peer"24	"github.com/jech/storrent/tor"25	"github.com/jech/storrent/tracker"26)27type handler struct {28	ctx context.Context29}30func NewHandler(ctx context.Context) http.Handler {31	return &handler{ctx}32}33func (handler *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {34	host, _, err := net.SplitHostPort(r.Host)35	if err != nil {36		http.Error(w, err.Error(), http.StatusBadRequest)37		return38	}39	// The server is only bound to localhost, but an attacker might be40	// able to cause the user's browser to connect to localhost by41	// manipulating the DNS.  Prevent this by making sure that the42	// browser thinks it's connecting to localhost.43	if host != "localhost" && net.ParseIP(host) == nil {44		http.Error(w, "Forbidden", http.StatusForbidden)45		return46	}47	pth := r.URL.Path48	if pth == "/" {49		root(handler.ctx, w, r)50		return51	}52	if len(pth) < 41 {53		http.NotFound(w, r)54		return55	}56	hash := hash.Parse(pth[1:41])57	if hash == nil {58		http.NotFound(w, r)59		return60	}61	if r.Method != "HEAD" && r.Method != "GET" {62		w.Header().Set("allow", "HEAD, GET")63		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)64		return65	}66	if len(pth) == 41 {67		t := tor.Get(hash)68		if t == nil {69			http.NotFound(w, r)70			return71		}72		http.Redirect(w, r, pth+"/", http.StatusMovedPermanently)73		return74	}75	if pth[41] == '/' {76		err = r.ParseForm()77		if err != nil {78			http.Error(w, err.Error(), http.StatusBadRequest)79			return80		}81		if r.Form["playlist"] != nil {82			playlist(w, r, hash, path.Parse(pth[42:]))83			return84		}85		if pth[len(pth)-1] == '/' {86			directory(w, r, hash, path.Parse(pth[42:]))87			return88		} else {89			file(w, r, hash, path.Parse(pth[42:]))90			return91		}92	}93	if pth[41] == '.' {94		extension := pth[42:]95		if extension == "torrent" {96			torfile(w, r)97			return98		} else if extension == "m3u" {99			playlist(w, r, hash, nil)100			return101		}102	}103	http.NotFound(w, r)104}105func getTorrent(ctx context.Context, data string) (*tor.Torrent, error) {106	t, err := tor.ReadMagnet(config.DefaultProxy(), data)107	if t != nil || err != nil {108		return t, err109	}110	return tor.GetTorrent(ctx, config.DefaultProxy(), data)111}112func root(serverctx context.Context, w http.ResponseWriter, r *http.Request) {113	if r.Method != "HEAD" && r.Method != "GET" && r.Method != "POST" {114		w.Header().Set("allow", "HEAD, GET, POST")115		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)116		return117	}118	err := r.ParseForm()119	if err != nil {120		http.Error(w, err.Error(), http.StatusBadRequest)121		return122	}123	q := r.Form.Get("q")124	if q == "" {125		if r.Method != "HEAD" && r.Method != "GET" {126			http.Error(w, "Method not allowed",127				http.StatusMethodNotAllowed)128			return129		}130		torrents(w, r)131		return132	} else if q == "peers" {133		if r.Method != "HEAD" && r.Method != "GET" {134			http.Error(w, "Method not allowed",135				http.StatusMethodNotAllowed)136			return137		}138		hash := hash.Parse(r.Form.Get("hash"))139		if hash == nil {140			http.NotFound(w, r)141			return142		}143		torrent := tor.Get(hash)144		if torrent == nil {145			http.NotFound(w, r)146			return147		}148		peers(w, r, torrent)149		return150	} else if q == "add" {151		data := strings.TrimSpace(r.FormValue("url"))152		if data == "" {153			http.Error(w, "No torrent supplied", http.StatusBadRequest)154			return155		}156		t, err := getTorrent(r.Context(), data)157		if t == nil || err != nil {158			http.Error(w, err.Error(), http.StatusBadGateway)159			return160		}161		_, err = tor.AddTorrent(serverctx, t)162		if err != nil && err != os.ErrExist {163			http.Error(w, err.Error(),164				http.StatusInternalServerError)165			return166		}167		http.Redirect(w, r, "/", http.StatusSeeOther)168		return169	} else if q == "delete" {170		h := hash.Parse(r.FormValue("hash"))171		if h == nil {172			http.Error(w, "couldn't parse hash", http.StatusBadRequest)173			return174		}175		t := tor.Get(h)176		if t == nil {177			http.NotFound(w, r)178			return179		}180		err := t.Kill(r.Context())181		if err != nil {182			if errors.Is(err, tor.ErrTorrentDead) {183				http.NotFound(w, r)184			} else {185				http.Error(w, err.Error(),186					http.StatusInternalServerError)187			}188			return189		}190		http.Redirect(w, r, "/", http.StatusSeeOther)191		return192	} else if q == "set" {193		upload := r.Form.Get("upload")194		if upload != "" {195			v, err := strconv.ParseFloat(upload, 64)196			if err != nil {197				http.Error(w, err.Error(), http.StatusBadRequest)198				return199			}200			config.SetUploadRate(v)201		}202		idle := r.Form.Get("idle")203		if idle != "" {204			v, err := strconv.ParseFloat(idle, 64)205			if err != nil {206				http.Error(w, err.Error(), http.StatusBadRequest)207				return208			}209			config.SetIdleRate(v)210		}211		http.Redirect(w, r, "/", http.StatusSeeOther)212		return213	} else if q == "set-torrent" {214		h := hash.Parse(r.FormValue("hash"))215		if h == nil {216			http.Error(w, "couldn't parse hash", http.StatusBadRequest)217			return218		}219		t := tor.Get(h)220		if t == nil {221			http.NotFound(w, r)222			return223		}224		conf := peer.TorConf{225			UseDht:      peer.ConfGet(r.Form.Get("use-dht") != ""),226			DhtPassive:  peer.ConfGet(r.Form.Get("dht-passive") != ""),227			UseTrackers: peer.ConfGet(r.Form.Get("use-trackers") != ""),228			UseWebseeds: peer.ConfGet(r.Form.Get("use-webseeds") != ""),229		}230		err = t.SetConf(conf)231		if err != nil {232			http.Error(w, err.Error(),233				http.StatusInternalServerError)234			return235		}236		http.Redirect(w, r, "/", http.StatusSeeOther)237		return238	} else {239		http.Error(w, "Bad request", http.StatusBadRequest)240		return241	}242}243func header(w http.ResponseWriter, r *http.Request, title string) bool {244	w.Header().Set("content-type", "text/html; charset=utf-8")245	w.Header().Set("cache-control", "no-cache")246	if r.Method == "HEAD" {247		return true248	}249	fmt.Fprintf(w, "<!DOCTYPE html>\n<html><head>\n")250	fmt.Fprintf(w, "<title>%v</title>\n", html.EscapeString(title))251	if r.Host != "" {252		fmt.Fprintf(w, "<script type=\"text/javascript\">\n")253		fmt.Fprintf(w, "navigator.registerProtocolHandler('magnet','http://%v/?q=add&url=%%s','Torrent');\n",254			r.Host)255		fmt.Fprintf(w, "</script>\n")256	}257	fmt.Fprintf(w, "</head><body>\n")258	return false259}260func footer(w http.ResponseWriter) {261	fmt.Fprintf(w, "</body></html>\n")262}263func directory(w http.ResponseWriter, r *http.Request, hash hash.Hash, pth path.Path) {264	ctx := r.Context()265	t := tor.Get(hash)266	if t == nil {267		http.NotFound(w, r)268		return269	}270	done := header(w, r, t.Name)271	if done {272		return273	}274	err := torrentEntry(ctx, w, t, pth)275	if err != nil {276		return277	}278	footer(w)279}280func pathUrl(p path.Path) string {281	var b []byte282	for _, s := range p {283		t := url.PathEscape(s)284		b = append(b, t...)285		b = append(b, '/')286	}287	return string(b[0 : len(b)-1])288}289func torrentFile(w io.Writer, hash hash.Hash, path path.Path, length int64, available int) {290	p := pathUrl(path)291	fmt.Fprintf(w,292		"<tr><td><a href=\"/%v/%v\">%v</a></td>"+293			"<td>%v</td><td>%v</td></tr>\n",294		hash, p, html.EscapeString(path.String()),295		length, available)296}297func torrentDir(w io.Writer, hash hash.Hash, pth path.Path, lastdir path.Path) {298	var dir path.Path299	for i := 0; i < len(pth) && i < len(lastdir); i++ {300		if pth[i] != lastdir[i] {301			break302		}303		dir = append(dir, pth[i])304	}305	for i := len(dir); i < len(pth); i++ {306		dir = append(dir, pth[i])307		p := pathUrl(dir)308		fmt.Fprintf(w,309			"<tr><td><a href=\"/%v/%v/\">%v/</a></td><td>"+310				"(<a href=\"/%v/%v/?playlist\">playlist</a>)"+311				"</td></tr>\n",312			hash, p, html.EscapeString(dir.String()),313			hash, p)314	}315}316func torrentEntry(ctx context.Context, w http.ResponseWriter, t *tor.Torrent, dir path.Path) error {317	hash := t.Hash318	name := t.Name319	if !t.InfoComplete() {320		if name != "" {321			name = name + " "322		}323		name = name + "<em>(incomplete)</em>"324	}325	fmt.Fprintf(w, "<p><a href=\"/%v/\">%v</a> ", hash, name)326	fmt.Fprintf(w, "<a href=\"/%v.torrent\">%v</a> ", hash, hash)327	fmt.Fprintf(w, "(<a href=\"/%v.m3u\">playlist</a>): ", hash)328	c := t.Pieces.Bitmap().Count()329	if t.InfoComplete() {330		fmt.Fprintf(w, "%v bytes in %v+%v/%v pieces (%v bytes each), ",331			t.Pieces.Bytes(),332			c, t.Pieces.Count()-c,333			(t.Pieces.Length()+int64(t.Pieces.PieceSize())-1)/334				int64(t.Pieces.PieceSize()),335			t.Pieces.PieceSize())336	}337	stats, _ := t.GetStats()338	if stats != nil {339		fmt.Fprintf(w, "<a href=\"/?q=peers&hash=%v\">%v/%v peers</a>",340			hash, stats.NumPeers, stats.NumKnown)341	}342	fmt.Fprintf(w, "</p>")343	fmt.Fprintf(w, "<p><table>\n")344	if !t.InfoComplete() {345	} else if t.Files == nil {346		if err := ctx.Err(); err != nil {347			return err348		}349		if len(dir) == 0 {350			available, _ := t.GetAvailable()351			torrentFile(w, t.Hash, path.Parse(t.Name),352				t.Pieces.Length(),353				available.AvailableRange(t,354					0, t.Pieces.Length()))355		}356	} else {357		a := make([]int, 0, len(t.Files))358		for i := range t.Files {359			if t.Files[i].Path.Within(dir) {360				a = append(a, i)361			}362		}363		sort.Slice(a, func(i, j int) bool {364			return t.Files[a[i]].Path.Less(t.Files[a[j]].Path)365		})366		var lastdir path.Path367		available, _ := t.GetAvailable()368		for _, i := range a {369			if err := ctx.Err(); err != nil {370				return err371			}372			f := t.Files[i]373			path := f.Path374			dir := path[:len(path)-1]375			if !dir.Equal(lastdir) {376				torrentDir(w, t.Hash, dir, lastdir)377				lastdir = dir378			}379			torrentFile(w, t.Hash, f.Path, f.Length,380				available.AvailableRange(t, f.Offset, f.Length))381		}382	}383	fmt.Fprintf(w, "</table></p>\n")384	conf, err := t.GetConf()385	if err == nil {386		var useDht, dhtPassive, useTrackers, useWebseeds string387		if conf.UseDht == peer.ConfTrue {388			useDht = " checked"389		}390		if conf.DhtPassive == peer.ConfTrue {391			dhtPassive = " checked"392		}393		if conf.UseTrackers == peer.ConfTrue {394			useTrackers = " checked"395		}396		if conf.UseWebseeds == peer.ConfTrue {397			useWebseeds = " checked"398		}399		fmt.Fprintf(w, "<form action=\"/?q=set-torrent\" method=\"post\">\n")400		if dht.Available() {401			fmt.Fprintf(w, "<input type=\"checkbox\" id=\"use-dht-%v\" name=\"use-dht\"%v/><label for=\"use-dht-%v\">Use DHT</label> ", t.Hash, useDht, t.Hash)402			fmt.Fprintf(w, "<input type=\"checkbox\" id=\"dht-passive-%v\" name=\"dht-passive\"%v/><label for=\"dht-passive-%v\">Passive DHT</label> ", t.Hash, dhtPassive, t.Hash)403		}404		fmt.Fprintf(w, "<input type=\"checkbox\" id=\"use-trackers-%v\" name=\"use-trackers\"%v/><label for=\"use-trackers-%v\">Use trackers (%v)</label> ", t.Hash, useTrackers, t.Hash, stats.NumTrackers)405		fmt.Fprintf(w, "<input type=\"checkbox\" id=\"use-webseeds-%v\" name=\"use-webseeds\"%v/><label for=\"use-webseeds-%v\">Use webseeds (%v)</label> ", t.Hash, useWebseeds, t.Hash, stats.NumWebseeds)406		fmt.Fprintf(w, "<button type=\"submit\" name=\"hash\" value=\"%v\">Set</button></form>\n", t.Hash)407	}408	fmt.Fprintf(w, "<form action=\"/?q=delete\" class=\"delete-form\" method=\"post\"><button type=\"submit\" name=\"hash\" value=\"%v\">Delete</button></form>\n",409		t.Hash)410	return nil411}412func torrents(w http.ResponseWriter, r *http.Request) {413	ctx := r.Context()414	done := header(w, r, "STorrent")415	if done {416		return417	}418	fmt.Fprintf(w, "<form action=\"/?q=add\" method=\"post\">Magnet or URL: <input type=\"text\" name=\"url\"/> <input type=\"submit\"/></form> ")419	fmt.Fprintf(w, "<form action=\"/?q=set\" method=\"post\">Idle download: <input type=\"text\" name=\"idle\"/> Upload: <input type=\"text\" name=\"upload\"/> <input type=\"submit\"/></form>\n")420	fmt.Fprintf(w, "<p>Download %.0f/%.0f, upload %.0f/%.0f (unchoking %v), ",421		peer.DownloadEstimator.Estimate(), config.IdleRate(),422		peer.UploadEstimator.Estimate(), config.UploadRate(),423		peer.NumUnchoking())424	if dht.Available() {425		g4, g6, d4, d6, i4, i6 := dht.Count()426		fmt.Fprintf(w, "DHT %v+%v/%v %v+%v/%v, ",427			g4, i4, g4+d4,428			g6, i6, g6+d6)429	}430	fmt.Fprintf(w, "%v/%v bytes allocated.</p>\n",431		alloc.Bytes(), config.MemoryHighMark())432	var tors []*tor.Torrent433	tor.Range(func(k hash.Hash, t *tor.Torrent) bool {434		tors = append(tors, t)435		return true436	})437	sort.Slice(tors, func(i, j int) bool {438		return tors[i].Name < tors[j].Name ||439			(tors[i].Name == tors[j].Name &&440				bytes.Compare(tors[i].Hash, tors[j].Hash) < 0)441	})442	for _, t := range tors {443		err := torrentEntry(ctx, w, t, path.Path(nil))444		if err != nil {445			return446		}447	}448	footer(w)449}450func peers(w http.ResponseWriter, r *http.Request, t *tor.Torrent) {451	ps, err := t.GetPeers()452	if err != nil {453		if errors.Is(err, tor.ErrTorrentDead) {454			http.NotFound(w, r)455		} else {456			http.Error(w, err.Error(),457				http.StatusInternalServerError)458		}459		return460	}461	kps, err := t.GetKnowns()462	if err != nil {463		if errors.Is(err, tor.ErrTorrentDead) {464			http.NotFound(w, r)465		} else {466			http.Error(w, err.Error(),467				http.StatusInternalServerError)468		}469		return470	}471	done := header(w, r, "Peers for "+t.Name)472	if done {473		return474	}475	sort.Slice(ps, func(i, j int) bool {476		return bytes.Compare(ps[i].Id, ps[j].Id) < 0477	})478	fmt.Fprintf(w, "<p><table>\n")479	for _, p := range ps {480		hpeer(w, p, t)481	}482	fmt.Fprintf(w, "</table></p>\n")483	trackers := t.Trackers()484	if len(trackers) > 0 {485		fmt.Fprintf(w, "<p><table>\n")486		for i, tl := range trackers {487			for _, tt := range tl {488				state := ""489				st, err := tt.GetState()490				if st == tracker.Error && err != nil {491					state = fmt.Sprintf("(%v)", err)492				} else if st != tracker.Idle {493					state = fmt.Sprintf("(%v)", st.String())494				}495				fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td></tr>\n",496					tt.URL(), state)497			}498			if i+1 < len(trackers) {499				fmt.Fprintf(w, "<tr></tr>\n")500			}501		}502		fmt.Fprintf(w, "</table></p>\n")503	}504	wss := t.Webseeds()505	if len(wss) > 0 {506		fmt.Fprintf(w, "<p><table>\n")507		for _, ws := range t.Webseeds() {508			cnt := ""509			count := ws.Count()510			if count > 0 {511				cnt = fmt.Sprintf("%v", count)512			}513			fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td><td>%.0f</td>",514				ws.URL(), cnt, ws.Rate())515		}516		fmt.Fprintf(w, "</table></p>\n")517	}518	sort.Slice(kps, func(i, j int) bool {519		v41 := kps[i].Addr.IP.To4()520		v42 := kps[j].Addr.IP.To4()521		var a1, a2 []byte522		if v41 == nil && v42 != nil {523			return true524		} else if v41 != nil && v42 == nil {525			return false526		} else if v41 != nil && v42 != nil {527			a1 = v41528			a2 = v42529		} else {530			a1 = kps[i].Addr.IP.To16()531			a2 = kps[j].Addr.IP.To16()532		}533		c := bytes.Compare(a1, a2)534		if c < 0 {535			return true536		} else if c > 0 {537			return false538		}539		return kps[i].Addr.Port < kps[j].Addr.Port540	})541	fmt.Fprintf(w, "<p><table>\n")542	for _, k := range kps {543		hknown(w, &k, t)544	}545	fmt.Fprintf(w, "</table></p>\n")546	footer(w)547}548func parseId(id []byte) string {549	if id[0] == '-' && id[7] == '-' {550		return string(id[1:7])551	}552	return ""553}554func hpeer(w http.ResponseWriter, p *peer.Peer, t *tor.Torrent) {555	kp, _ := t.GetKnown(p.Id, p.IP, p.GetPort())556	var addr string557	if p.Port == 0 {558		if kp != nil {559			addr = kp.Addr.String()560		} else {561			addr = p.IP.String()562		}563	} else {564		a := net.TCPAddr{IP: p.IP, Port: p.GetPort()}565		addr = a.String()566	}567	fmt.Fprintf(w, "<tr><td>%v</td>", addr)568	stats := p.GetStats()569	if stats == nil {570		fmt.Fprintf(w, "<td><em>(dead)</em></td></tr>\n")571		return572	}573	var prefix, suffix string574	if !stats.Unchoked {575		prefix = "("576		suffix = ")"577	}578	qlen := stats.Qlen - stats.Rlen579	if qlen != 0 {580		fmt.Fprintf(w, "<td>%v%v+%v%v</td>",581			prefix, stats.Rlen, qlen, suffix)582	} else if stats.Rlen > 0 {583		fmt.Fprintf(w, "<td>%v%v%v</td>", prefix, stats.Rlen, suffix)584	} else if stats.Unchoked {585		fmt.Fprintf(w, "<td>0</td>")586	} else if stats.AmInterested {587		fmt.Fprintf(w, "<td>·</td>")588	} else {589		fmt.Fprintf(w, "<td></td>")590	}591	fmt.Fprintf(w, "<td>%.0f/%.0f</td>", stats.AvgDownload, stats.Download)592	var zero time.Time593	if stats.AmUnchoking {594		fmt.Fprintf(w, "<td>%v</td>", stats.Ulen)595	} else if stats.Interested {596		if stats.UnchokeTime.Equal(zero) {597			fmt.Fprintf(w, "<td>(∞s)</td>")598		} else {599			fmt.Fprintf(w, "<td>(%vs)</td>",600				int((time.Since(stats.UnchokeTime)+601					time.Second/2)/time.Second))602		}603	} else {604		fmt.Fprintf(w, "<td></td>")605	}606	fmt.Fprintf(w, "<td>%.0f</td>", stats.Upload)607	if stats.Rtt != 0 || stats.Rttvar != 0 {608		fmt.Fprintf(w, "<td>%.0f±%.0f</td>",609			float64(stats.Rtt)/float64(time.Millisecond),610			float64(stats.Rttvar)/float64(time.Millisecond))611	} else {612		fmt.Fprintf(w, "<td></td>")613	}614	var scount string615	if t.Pieces.PieceSize() > 0 {616		count := (t.Pieces.Length() +617			int64(t.Pieces.PieceSize()) - 1) /618			int64(t.Pieces.PieceSize())619		scount = fmt.Sprintf("/%v", count)620	} else {621		scount = ""622	}623	flags := ""624	if stats.HasProxy {625		flags += "P"626	}627	if p.Incoming {628		flags += "I"629	}630	if p.Encrypted() {631		flags += "E"632	}633	if stats.AmUnchoking {634		flags += "U"635	} else if stats.Interested {636		flags += "u"637	}638	if stats.Seed {639		flags += "S"640	} else if stats.UploadOnly {641		flags += "s"642	}643	fmt.Fprintf(w, "<td>%v%v</td><td>%v</td>",644		stats.PieceCount, scount, flags)645	if stats.NumPex > 0 {646		fmt.Fprintf(w, "<td>%v</td>", stats.NumPex)647	} else {648		fmt.Fprintf(w, "<td></td>")649	}650	var version string651	if kp != nil {652		version = kp.Version653	}654	if version == "" {655		version = parseId(p.Id)656	}657	fmt.Fprintf(w, "<td>%v</td>", html.EscapeString(version))658	fmt.Fprintf(w, "<td>%v</td></tr>", p.Id)659}660func recent(tm time.Time) bool {661	return time.Since(tm) < 35*time.Minute662}663func hknown(w http.ResponseWriter, kp *known.Peer, t *tor.Torrent) {664	buf := new(bytes.Buffer)665	if kp.Attempts > 0 {666		fmt.Fprintf(buf, "%v, ", kp.Attempts)667	}668	if recent(kp.SeenTime) || recent(kp.ActiveTime) {669		fmt.Fprintf(buf, "Seen, ")670	}671	if recent(kp.HeardTime) {672		fmt.Fprintf(buf, "Heard, ")673	}674	if recent(kp.TrackerTime) {675		fmt.Fprintf(buf, "T, ")676	}677	if recent(kp.DHTTime) {678		fmt.Fprintf(buf, "DHT, ")679	}680	if recent(kp.PEXTime) {681		fmt.Fprintf(buf, "PEX, ")682	}683	if kp.Bad() {684		fmt.Fprintf(buf, "Bad, ")685	}686	var flags string687	if buf.Len() > 2 {688		b := buf.Bytes()689		flags = string(b[0 : len(b)-2])690	} else {691		flags = buf.String()692	}693	fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td><td>%v</td><td>%v</td></tr>\n",694		kp.Addr.String(), flags, html.EscapeString(kp.Version), kp.Id)695}696func torfile(w http.ResponseWriter, r *http.Request) {697	path := r.URL.Path698	if path[0] != '/' || len(path) <= 41 {699		http.NotFound(w, r)700		return701	}702	hash := hash.Parse(path[1:41])703	if hash == nil {704		http.NotFound(w, r)705		return706	}707	t := tor.Get(hash)708	if t == nil {709		http.NotFound(w, r)710		return711	}712	if !t.InfoComplete() {713		http.Error(w, "torrent metadata incomplete",714			http.StatusGatewayTimeout)715		return716	}717	w.Header().Set("content-type", "application/x-bittorrent")718	if t.CreationDate > 0 {719		cdate := time.Unix(t.CreationDate, 0)720		w.Header().Set("last-modified",721			cdate.UTC().Format(http.TimeFormat))722	}723	if r.Method == "HEAD" {724		return725	}726	err := tor.WriteTorrent(w, t)727	if err != nil {728		panic(http.ErrAbortHandler)729	}730}731func m3uentry(w http.ResponseWriter, host string, hash hash.Hash, path path.Path) {732	fmt.Fprintf(w, "#EXTINF:-1,%v\n",733		strings.Replace(path[len(path)-1], ",", "", -1))734	fmt.Fprintf(w, "http://%v/%v/%v\n",735		host, hash, pathUrl(path))736}737func playlist(w http.ResponseWriter, r *http.Request, hash hash.Hash, dir path.Path) {738	t := tor.Get(hash)739	if t == nil {740		http.NotFound(w, r)741		return742	}743	if !t.InfoComplete() {744		http.Error(w, "torrent metadata incomplete",745			http.StatusGatewayTimeout)746		return747	}748	if t.Files == nil {749		if len(dir) > 0 {750			http.NotFound(w, r)751			return752		}753	} else {754		var found bool755		for _, f := range t.Files {756			if f.Path.Within(dir) {757				found = true758				break759			}760		}761		if !found {762			http.NotFound(w, r)763			return764		}765	}766	w.Header().Set("content-type", "application/vnd.apple.mpegurl")767	if t.CreationDate > 0 {768		cdate := time.Unix(t.CreationDate, 0)769		w.Header().Set("last-modified",770			cdate.UTC().Format(http.TimeFormat))771	}772	if r.Method == "HEAD" {773		return774	}775	fmt.Fprintf(w, "#EXTM3U\n")776	if t.Files == nil {777		m3uentry(w, r.Host, hash, path.Parse(t.Name))778	} else {779		a := make([]int, len(t.Files))780		for i := range a {781			a[i] = i782		}783		sort.Slice(a, func(i, j int) bool {784			return t.Files[a[i]].Path.Less(t.Files[a[j]].Path)785		})786		for _, i := range a {787			path := t.Files[i].Path788			if path.Within(dir) {789				m3uentry(w, r.Host, hash, path)790			}791		}792	}793}794func file(w http.ResponseWriter, r *http.Request, hash hash.Hash, path path.Path) {795	t := tor.Get(hash)796	if t == nil {797		http.NotFound(w, r)798		return799	}800	if !t.InfoComplete() {801		http.Error(w, "torrent metadata incomplete",802			http.StatusGatewayTimeout)803		return804	}805	offset, length, etag, err := fileParms(t, hash, path)806	if err != nil {807		if os.IsNotExist(err) {808			http.NotFound(w, r)809			return810		} else {811			http.Error(w, err.Error(),812				http.StatusInternalServerError)813			return814		}815	}816	var ctime time.Time817	if t.CreationDate > 0 {818		ctime = time.Unix(t.CreationDate, 0)819	}820	w.Header().Set("etag", etag)821	reader := t.NewReader(r.Context(), offset, length)822	defer reader.Close()823	http.ServeContent(w, r, path.String(), ctime, reader)824}825func fileParms(t *tor.Torrent, hash hash.Hash, pth path.Path) (offset int64, length int64, etag string, err error) {826	var file *tor.Torfile827	if t.Files == nil {828		if len(pth) != 1 || pth[0] != t.Name {829			err = os.ErrNotExist830			return831		}832		offset = 0833		length = t.Pieces.Length()834	} else {835		for _, f := range t.Files {836			if pth.Equal(f.Path) {837				file = &f838				break839			}840		}841		if file == nil {842			err = os.ErrNotExist843			return844		}845		offset = file.Offset846		length = file.Length847	}848	etag = fmt.Sprintf("\"%v-%v\"", hash.String(), offset)849	return850}...edit.go
Source:edit.go  
1package handlers2import (3	"fmt"4	"net/http"5	"strconv"6	"github.com/craigjperry2/mingo/internal/app/mingo/config"7	"github.com/craigjperry2/mingo/internal/app/mingo/database"8)9// Handle CRUD requests to the Person resource10type EditHandler struct {11	db *database.Db12}13func NewEditHandler() EditHandler {14	return EditHandler{config.GetInstance().GetDatabase()}15}16func (h EditHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {17	switch req.Method {18	case http.MethodPut:19		if req.URL.Path != "/edit" {20			http.NotFound(w, req)21			return22		}23		id, err := strconv.Atoi(req.URL.Query().Get("id"))24		if err != nil {25			http.NotFound(w, req)26			return27		}28		req.ParseForm()29		p, _ := h.db.Update(id, req.FormValue("name"), req.FormValue("location"))30		fmt.Fprintf(w, `<tr> <td>%d</td> <td>%s</td> <td>%s</td> <td><div class="buttons are-small"><button class="button is-info" hx-get="/edit?id=%d">Edit</button><button class="button is-danger" hx-delete="/crud?id=%d">Delete</button></div></td> </tr>`, p.Id, p.Name, p.Location, p.Id, p.Id)31	case http.MethodPost:32		if req.URL.Path != "/edit" {33			http.NotFound(w, req)34			return35		}36		req.ParseForm()37		p, _ := h.db.Insert(req.FormValue("name"), req.FormValue("location"))38		fmt.Fprintf(w, `<tr hx-swap-oob="afterbegin:.tablebody" hx-swap="outerHTML"><td>%d</td> <td>%s</td> <td>%s</td> <td><div class="buttons are-small"><button class="button is-info" hx-get="/edit?id=%d">Edit</button><button class="button is-danger" hx-delete="/crud?id=%d">Delete</button></div></td> </tr> <tr> <td></td> <td><input name="name" placeholder="name"></td> <td><input name="location" placeholder="location"></td> <td><div class="buttons are-small"><button class="button is-info" hx-post="/edit" hx-include="closest tr" hx-target="closest tr" hx-swap="outerHTML">Add</button></div></td> </tr>`, p.Id, p.Name, p.Location, p.Id, p.Id)39	default: // GET40		if req.URL.Path != "/edit" {41			http.NotFound(w, req)42			return43		}44		id, err := strconv.Atoi(req.URL.Query().Get("id"))45		if err != nil {46			http.NotFound(w, req)47			return48		}49		row, _ := h.db.Get(id)50		fmt.Fprintf(w, `<tr> <td>%d</td> <td><input name='name' value='%s'></td> <td><input name='location' value='%s'></td> <td><div class="buttons are-small"><button class="button is-info">Cancel</button><button class="button is-danger" hx-put="/edit?id=%d" hx-include="closest tr">Save</button></div></td> </tr>`, row.Id, row.Name, row.Location, row.Id)51	}52}...crud.go
Source:crud.go  
1package handlers2import (3	"fmt"4	"net/http"5	"strconv"6	"github.com/craigjperry2/mingo/internal/app/mingo/config"7	"github.com/craigjperry2/mingo/internal/app/mingo/database"8)9// Handle CRUD requests to the Person resource10type CrudHandler struct {11	db *database.Db12}13func NewCrudHandler() CrudHandler {14	return CrudHandler{config.GetInstance().GetDatabase()}15}16func (h CrudHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {17	switch req.Method {18	case http.MethodDelete:19		if req.URL.Path != "/crud" {20			http.NotFound(w, req)21			return22		}23		id, err := strconv.Atoi(req.URL.Query().Get("id"))24		if err != nil {25			http.NotFound(w, req)26			return27		}28		h.db.Delete(id)29	case http.MethodPut:30		if req.URL.Path != "/crud" {31			http.NotFound(w, req)32			return33		}34	default: // GET35		if req.URL.Path != "/crud" {36			http.NotFound(w, req)37			return38		}39		offset, err := strconv.Atoi(req.URL.Query().Get("offset"))40		if err != nil || offset < 0 {41			offset = 042		}43		limit, err := strconv.Atoi(req.URL.Query().Get("limit"))44		if err != nil || limit < 1 {45			limit = 146		}47		all, _ := h.db.GetAll(offset, limit)48		for _, p := range all {49			fmt.Fprintf(w, `<tr> <td>%d</td> <td>%s</td> <td>%s</td> <td><div class="buttons are-small"><button class="button is-info" hx-get="/edit?id=%d">Edit</button><button class="button is-danger" hx-delete="/crud?id=%d">Delete</button></div></td> </tr>`, p.Id, p.Name, p.Location, p.Id, p.Id)50		}51		if limit == len(all) {52			fmt.Fprintf(w, `<tr id="replaceMe"> <td colspan="4" class="has-text-centered"> <button class="button is-link" hx-get="/crud?limit=%d&offset=%d" hx-target="#replaceMe" hx-swap="outerHTML" hx-confirm="unset"> Load More... <span class="htmx-indicator is-transparent"> <span class="icon-text"> <span class="icon"> <i class="fas fa-spinner"></i> </span> </span> </span> </button> </td> </tr>`, limit, all[len(all)-1].Id)53		}54	}55}...notFound
Using AI Code Generation
1import (2func notFound(w http.ResponseWriter, r *http.Request) {3	t, _ := template.ParseFiles("404.html")4	t.Execute(w, nil)5}6func main() {7	http.HandleFunc("/", notFound)8	http.ListenAndServe(":8080", nil)9}10import (11func notFound(w http.ResponseWriter, r *http.Request) {12	t, _ := template.ParseFiles("404.html")13	t.Execute(w, nil)14}15func main() {16	http.HandleFunc("/", notFound)17	http.ListenAndServe(":8080", nil)18}19import (20func notFound(w http.ResponseWriter, r *http.Request) {21	t, _ := template.ParseFiles("404.html")22	t.Execute(w, nil)23}24func main() {25	http.Handle("/", http.HandlerFunc(notFound))26	http.ListenAndServe(":8080", nil)27}28import (29func notFound(w http.ResponseWriter, r *http.Request) {30	t, _ := template.ParseFiles("404.html")31	t.Execute(w, nil)32}33func main() {34	http.Handle("/", http.HandlerFunc(notFound))35	http.ListenAndServe(":8080", nil)36}notFound
Using AI Code Generation
1import (2func (m td) ServeHTTP(w http.ResponseWriter, req *http.Request) {3	fmt.Println(req.URL.Path)4	if req.URL.Path == "/dog/" {5		fmt.Fprintln(w, "doggy doggy doggy")6	} else if req.URL.Path == "/cat/" {7		fmt.Fprintln(w, "kitty kitty kitty")8	} else {9		fmt.Fprintln(w, "not found")10	}11}12func main() {13	http.ListenAndServe(":8080", d)14}15import (16func (m td) ServeHTTP(w http.ResponseWriter, req *http.Request) {17	fmt.Println(req.URL.Path)18	if req.URL.Path == "/dog/" {19		fmt.Fprintln(w, "doggy doggy doggy")20	} else if req.URL.Path == "/cat/" {21		fmt.Fprintln(w, "kitty kitty kitty")22	}23}24func main() {25	http.ListenAndServe(":8080", d)26}27import (28func (m td) ServeHTTP(w http.ResponseWriter, req *http.Request) {29	fmt.Println(req.URL.Path)30	if req.URL.Path == "/dog/" {31		fmt.Fprintln(w, "doggy doggy doggy")32	} else if req.URL.Path == "/cat/" {33		fmt.Fprintln(w, "kitty kitty kitty")34	} else {35		http.NotFound(w, req)36	}37}38func main() {39	http.ListenAndServe(":8080", d)40}41import (42func (m td) ServeHTTP(w http.ResponseWriter, req *http.Request) {43	fmt.Println(req.URL.Path)44	if req.URL.Path == "/dog/" {45		fmt.Fprintln(w, "doggy doggy doggy")46	} else if req.URL.Path == "/cat/" {47		fmt.Fprintln(w, "kitty kitty kitty")48	} else {49		http.Error(wnotFound
Using AI Code Generation
1import (2func main() {3    c = max(a, b)4    fmt.Printf("Max value is : %d5}6func max(num1, num2 int) int {7    if (num1 > num2) {8    } else {9    }10}11import (12func main() {13    ret = max(a, b)14    fmt.Printf("Max value is : %d15}16func max(num1, num2 int) int {17    if (num1 > num2) {18    } else {19    }20}21import (22func main() {23    ret = max(a, b)24    fmt.Printf("Max value is : %d25}26func max(num1, num2 int) int {27    if (num1 > num2) {28    } else {29    }30}31import (32func main() {33    ret = max(a, b)34    fmt.Printf("Max value is : %d35}36func max(num1, num2 int) int {37    if (num1 > num2) {38    } else {39    }40}notFound
Using AI Code Generation
1func main() {2    td := &td{}3    td.notFound()4}5func main() {6    td := &td{}7    td.notFound()8}9func main() {10    td := &td{}11    td.notFound()12}13func main() {14    td := &td{}15    td.notFound()16}17func main() {18    td := &td{}19    td.notFound()20}21func main() {22    td := &td{}23    td.notFound()24}25func main() {26    td := &td{}27    td.notFound()28}29func main() {30    td := &td{}31    td.notFound()32}33func main() {34    td := &td{}35    td.notFound()36}37func main() {38    td := &td{}39    td.notFound()40}41func main() {42    td := &td{}43    td.notFound()44}45func main() {46    td := &td{}47    td.notFound()48}49func main() {50    td := &td{}51    td.notFound()52}53func main() {54    td := &td{}55    td.notFound()56}57func main() {58    td := &td{}59    td.notFound()60}notFound
Using AI Code Generation
1import (2func main() {3	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {4		fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))5	})6	http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {7		fmt.Fprintf(w, "test")8	})9	http.HandleFunc("/notfound", func(w http.ResponseWriter, r *http.Request) {10		http.NotFound(w, r)11	})12	http.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) {13	})14	http.HandleFunc("/form", func(w http.ResponseWriter, r *http.Request) {15		w.Header().Set("Content-Type", "text/html; charset=utf-8")16		switch r.Method {17			fmt.Fprintf(w, `<form method="POST" action="/form">18			r.ParseForm()19			fmt.Fprintf(w, "Post from website! r.PostFrom = %v20			for k, v := range r.PostForm {21				fmt.Fprintf(w, "k = %s, v = %s22			}23		}24	})25	http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {26		fmt.Println("method:", r.Method)27		if r.Method == "GET" {28			curtime := time.Now().Unix()29			h := md5.New()30			io.WriteString(h, strconv.FormatInt(curtime, 10))31			token := fmt.Sprintf("%x", h.Sum(nil))32			fmt.Println("token:", token)33			t, _ := template.ParseFiles("upload.gtpl")34			t.Execute(w, token)35		} else {36			r.ParseMultipartForm(32 << 20)37			file, handler, err := r.FormFile("uploadfile")38			if err != nil {39				fmt.Println(err)40			}41			defer file.Close()42			fmt.Fprintf(w, "%v", handler.Header)43			f, err := os.OpenFile("./test/"+handler.Filename, osnotFound
Using AI Code Generation
1import (2func main() {3	td := new(xlsx.Td)4	fmt.Println(td.NotFound())5}6import (7func main() {8	td := new(xlsx.Td)9	fmt.Println(td.Value())10}11import (12func main() {13	td := new(xlsx.Td)14	style := new(xlsx.Style)15	fmt.Println(td.SetStyle(style))16}17import (18func main() {19	td := new(xlsx.Td)20	fmt.Println(td.SetFormula("test"))21}22import (23func main() {24	td := new(xlsx.Td)25	richText := new(xlsx.RichText)26	fmt.Println(td.SetRichText(richText))27}28import (29func main() {30	td := new(xlsx.Td)31	hyperlink := new(xlsx.Hyperlink)32	fmt.Println(td.SetHyperlink(hyperlink))33}34import (35func main() {36	td := new(xlsx.Td)37	comment := new(xlsx.Comment)38	fmt.Println(td.SetComment(comment))39}40import (41func main() {42	td := new(xlsx.Td)43	fmt.Println(td.SetMerge("test"))44}notFound
Using AI Code Generation
1import (2type td struct {3}4func (t td) notFound() {5	fmt.Println("Not Found")6}7func main() {8	t := td{"test"}9	v := reflect.ValueOf(t)10	m := v.MethodByName("notFound")11	if m.IsValid() {12		args := []reflect.Value{}13		m.Call(args)14	} else {15		fmt.Println("Method not found")16	}17}18import (19type td struct {20}21func (t td) notFound() {22	fmt.Println("Not Found")23}24func main() {25	t := td{"test"}26	v := reflect.ValueOf(t)27	m := v.MethodByName("notFound")28	if m.IsValid() {29		args := []reflect.Value{}30		m.Call(args)31	} else {32		fmt.Println("Method not found")33	}34}35import (36type td struct {37}38func (t td) notFound() {39	fmt.Println("Not Found")40}41func main() {42	t := td{"test"}43	v := reflect.ValueOf(t)44	m := v.MethodByName("notFound")45	if m.IsValid() {46		args := []reflect.Value{}47		m.Call(args)48	} else {49		fmt.Println("Method not found")50	}51}52import (53type td struct {54}55func (t td) notFound() {56	fmt.Println("Not Found")57}58func main() {59	t := td{"test"}60	v := reflect.ValueOf(t)61	m := v.MethodByName("notFound")62	if m.IsValid() {63		args := []reflect.Value{}64		m.Call(args)65	} else {66		fmt.Println("Method not found")67	}68}69import (70type td struct {71}72func (t td)notFound
Using AI Code Generation
1import "fmt"2type testD interface {3    notFound() string4}5type testDImpl struct {6}7func (td *testDImpl) notFound() string {8}9func main() {10    td = &testDImpl{name: "test"}11    fmt.Println(td.notFound())12}notFound
Using AI Code Generation
1func main() {2    td := &td{}3    td.notFound()4}5func main() {6    td := &td{}7    td.notFound()8}9func main() {10    td := &td{}11    td.notFound()12}13func main() {14    td := &td{}15    td.notFound()16}17func main() {18    td := &td{}19    td.notFound()20}21func main() {22    td := &td{}23    td.notFound()24}25func main() {26    td := &td{}27    td.notFound()28}29func main() {30    td := &td{}31    td.notFound()32}33func main() {34    td := &td{}35    td.notFound()36}37func main() {38    td := &td{}39    td.notFound()40}41func main() {42    td := &td{}43    td.notFound()44}notFound
Using AI Code Generation
1import (2type td struct {3}4func main() {5	http.HandleFunc("/", foo)6	http.ListenAndServe(":8080", nil)7}8func foo(w http.ResponseWriter, r *http.Request) {9	tpl, err := template.ParseFiles("index.gohtml")10	if err != nil {11		log.Fatalln(err)12	}13	err = tpl.Execute(w, nil)14	if err != nil {15		log.Fatalln(err)16	}17}18func notFound(w http.ResponseWriter, r *http.Request) {19	tpl, err := template.ParseFiles("notFound.gohtml")20	if err != nil {21		log.Fatalln(err)22	}23	err = tpl.Execute(w, nil)24	if err != nil {25		log.Fatalln(err)26	}27}Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
