Skip to content

Commit

Permalink
bugfix: string formatting fix and tested
Browse files Browse the repository at this point in the history
  • Loading branch information
speakfriendnnter committed Aug 23, 2024
1 parent 0f49a6d commit b693fdd
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 21 deletions.
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,8 @@ run:
@if [ -f stream.ts ]; then rm stream.ts; fi
go run . -m3u8 $(uri) -start 1200 -end 1800 -queue 5

test:
@go test ./... -v

help:
go run . -help
59 changes: 38 additions & 21 deletions m3u8_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bufio"
"fmt"
"io"
"net/url"
"regexp"
"strconv"
"strings"
Expand Down Expand Up @@ -52,52 +53,68 @@ func (hp HlsParser) Parse() error {

var secondsSum int

var textToSeconds = func(sec string) (int, error) {
d, err := strconv.Atoi(sec)

if err != nil {
return 0, err
}

return d, nil
}

for scanner.Scan() {
text := scanner.Text()

if match := timeRegex.FindString(text); match != "" {
switch d, err := textToSeconds(match[:strings.Index(match, ".")]); err {
case nil:
secondsSum += d
default:
delta, err := hp.timeSum(match)

if err != nil {
return err
}

secondsSum += delta
}

skip, end := hp.TimeSkipper(secondsSum)

if skip {
if skip || !hp.validateTS(text) {
continue
} else if end {
break
}

if !hp.validateTS(text) {
continue
if end {
break
}

hp.uriChan <- fmt.Sprintf("%s/%s", hp.rootEndpoint, text)
if uri, err := url.Parse(text); err == nil {
hp.uriChan <- fmt.Sprintf("%s/%s", hp.rootEndpoint, uri.Path[1:])

} else {
return err
}

}

hp.uriChan <- ""
return nil
}

func (hp HlsParser) timeSum(match string) (int, error) {
switch d, err := hp.textToSeconds(match[:strings.Index(match, ".")]); err {
case nil:
return d, nil

default:
return -1, err
}
}

func (hp HlsParser) textToSeconds(sec string) (int, error) {
d, err := strconv.Atoi(sec)

if err != nil {
return 0, err
}

return d, nil
}

func (hp HlsParser) TimeSkipper(secondsSum int) (skip, end bool) {
if secondsSum < hp.start {
skip = true
} else if secondsSum > hp.end && hp.end != 0 {
}

if secondsSum > hp.end && hp.end != 0 {
end = true
}

Expand Down
59 changes: 59 additions & 0 deletions m3u8_parser_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package main

import (
"net/url"
"path"
"strings"
"sync"
"testing"
)

func FuzzParse(f *testing.F) {
var seeds []string = []string {
"https://some-fake-hosting/cdn/v1/app/11-video-id/i1.ts",
"https://fake.cdn.net/##$!qq_eiir482fdd/efev/aa/index-00.ts",
"/vplayer/cc/enus/100_index.ts",
"/hls/stream-11sso-11994/v.1.ts",
"/video-1.ts",
"/50.ts",
"/--308.ts?auth=fake-key-auth&state=permission&quality=1080p&fps=60",
"/stream/6c657347-8eff-473d-97af-3f17266c418c/720p60/v77.ts",
}

// settings seeds for fuzzing test
for _, seed := range seeds {
f.Add(seed)
}

var wg sync.WaitGroup

const defaultEndpoint = "https://fake-cdn-hosting.icnet/file.m3u8"

var link string

f.Fuzz(func(t *testing.T, in string) {
parser := NewHlsParser(strings.NewReader(in), path.Dir(defaultEndpoint), DefaultParseValidationFunc, 0, 0)
wg.Add(1)

go func() {
link = <- parser.UriChan()
<- parser.UriChan()
wg.Done()
}()

err := parser.Parse()
wg.Wait()

if err != nil {
t.Error(err)
}

uri, _ := url.Parse(defaultEndpoint)
inPath, _ := url.Parse(in)
expected := "https://" + uri.Host + inPath.Path

if expected != link {
t.Errorf("expected = %v, actual = %v", expected, link)
}
})
}

0 comments on commit b693fdd

Please sign in to comment.