diff --git a/proxy/freedom/freedom.go b/proxy/freedom/freedom.go index 55ad353d..6abcc553 100644 --- a/proxy/freedom/freedom.go +++ b/proxy/freedom/freedom.go @@ -402,6 +402,7 @@ func (f *FragmentWriter) Write(b []byte) (int, error) { } data := b[5:recordLen] buf := make([]byte, 1024) + var hello []byte for from := 0; ; { to := from + int(randBetween(int64(f.fragment.LengthMin), int64(f.fragment.LengthMax))) if to > len(data) { @@ -413,12 +414,22 @@ func (f *FragmentWriter) Write(b []byte) (int, error) { from = to buf[3] = byte(l >> 8) buf[4] = byte(l) - _, err := f.writer.Write(buf[:5+l]) - time.Sleep(time.Duration(randBetween(int64(f.fragment.IntervalMin), int64(f.fragment.IntervalMax))) * time.Millisecond) - if err != nil { - return 0, err + if f.fragment.IntervalMax == 0 { // combine fragmented tlshello if interval is 0 + hello = append(hello, buf[:5+l]...) + } else { + _, err := f.writer.Write(buf[:5+l]) + time.Sleep(time.Duration(randBetween(int64(f.fragment.IntervalMin), int64(f.fragment.IntervalMax))) * time.Millisecond) + if err != nil { + return 0, err + } } if from == len(data) { + if len(hello) > 0 { + _, err := f.writer.Write(hello) + if err != nil { + return 0, err + } + } if len(b) > recordLen { n, err := f.writer.Write(b[recordLen:]) if err != nil {