go-rfc2616/requestline/bytes_tolerant.go

123 lines
1.9 KiB
Go

package requestline
import (
"sourcecode.social/reiver/go-rfc2616/eol"
rfc2616method "sourcecode.social/reiver/go-rfc2616/method"
rfc2616requesturi "sourcecode.social/reiver/go-rfc2616/requesturi"
rfc2616version "sourcecode.social/reiver/go-rfc2616/version"
"sourcecode.social/reiver/go-rfc2616/sp"
)
func BytesTolerant(p []byte) (method []byte, requesturi []byte, version []byte, rest []byte, ok bool) {
if len(p) < 3 {
return nil, nil, nil, p, false
}
var pp []byte = p
{
result, rest, ok := rfc2616method.BytesTolerant(pp)
if !ok {
return nil, nil, nil, p, false
}
method = result
pp = rest
if len(pp) <= 0 {
return nil, nil, nil, p, false
}
}
{
pp0 := pp[0]
if !sp.ByteIs(pp0) {
return nil, nil, nil, p, false
}
pp = pp[1:]
}
{
pp = sp.SkipTolerant(pp)
if len(pp) <= 0 {
return nil, nil, nil, p, false
}
}
{
result, rest, ok := rfc2616requesturi.BytesTolerant(pp)
if !ok {
return nil, nil, nil, p, false
}
requesturi = result
pp = rest
if len(pp) <= 0 {
return method, requesturi, nil, pp, true
}
}
{
pp0 := pp[0]
switch {
case sp.ByteIs(pp0):
pp = pp[1:]
// Nothing (else) here.
default:
_, rest, ok := eol.BytesTolerant(pp)
if !ok {
return nil, nil, nil, p, false
}
return method, requesturi, nil, rest, true
}
}
{
pp = sp.SkipTolerant(pp)
if len(pp) <= 0 {
return method, requesturi, nil, pp, true
}
}
{
result, rest, ok := rfc2616version.BytesTolerant(pp)
if !ok {
return method, requesturi, nil, pp, true
}
version = result
pp = rest
if len(pp) <= 0 {
return method, requesturi, version, pp, true
}
}
{
pp = sp.SkipTolerant(pp)
if len(pp) <= 0 {
return method, requesturi, version, pp, true
}
}
{
_, rest, ok := eol.BytesTolerant(pp)
if !ok {
return nil, nil, nil, p, false
}
pp = rest
}
return method, requesturi, version, pp, true
}