Skip to content

Commit 0ecd2a2

Browse files
committed
Clean up errors & doc
1 parent fab5fce commit 0ecd2a2

File tree

2 files changed

+27
-16
lines changed

2 files changed

+27
-16
lines changed

packet_handlers.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const entitySentinel = 9999
1818

1919
func (p *Parser) handlePacketEntities(pe *msg.CSVCMsg_PacketEntities) {
2020
defer func() {
21-
p.setError(recoverFromPanic(recover()))
21+
p.setError(recoverFromUnexpectedEOF(recover()))
2222
}()
2323

2424
r := bit.NewSmallBitReader(bytes.NewReader(pe.EntityData))
@@ -85,7 +85,7 @@ func (p *Parser) readEnterPVS(reader *bit.BitReader, entityID int) *st.Entity {
8585

8686
func (p *Parser) handleGameEventList(gel *msg.CSVCMsg_GameEventList) {
8787
defer func() {
88-
p.setError(recoverFromPanic(recover()))
88+
p.setError(recoverFromUnexpectedEOF(recover()))
8989
}()
9090

9191
p.gehDescriptors = make(map[int32]*msg.CSVCMsg_GameEventListDescriptorT)
@@ -96,7 +96,7 @@ func (p *Parser) handleGameEventList(gel *msg.CSVCMsg_GameEventList) {
9696

9797
func (p *Parser) handleGameEvent(ge *msg.CSVCMsg_GameEvent) {
9898
defer func() {
99-
p.setError(recoverFromPanic(recover()))
99+
p.setError(recoverFromUnexpectedEOF(recover()))
100100
}()
101101

102102
if p.gehDescriptors == nil {
@@ -530,7 +530,7 @@ func getCommunityID(guid string) int64 {
530530

531531
func (p *Parser) handleUpdateStringTable(tab *msg.CSVCMsg_UpdateStringTable) {
532532
defer func() {
533-
p.setError(recoverFromPanic(recover()))
533+
p.setError(recoverFromUnexpectedEOF(recover()))
534534
}()
535535

536536
cTab := p.stringTables[tab.TableId]
@@ -547,7 +547,7 @@ func (p *Parser) handleUpdateStringTable(tab *msg.CSVCMsg_UpdateStringTable) {
547547

548548
func (p *Parser) handleCreateStringTable(tab *msg.CSVCMsg_CreateStringTable) {
549549
defer func() {
550-
p.setError(recoverFromPanic(recover()))
550+
p.setError(recoverFromUnexpectedEOF(recover()))
551551
}()
552552

553553
if tab.Name == stNameModelPreCache {
@@ -637,7 +637,7 @@ func (p *Parser) handleCreateStringTable(tab *msg.CSVCMsg_CreateStringTable) {
637637

638638
func (p *Parser) handleUserMessage(um *msg.CSVCMsg_UserMessage) {
639639
defer func() {
640-
p.setError(recoverFromPanic(recover()))
640+
p.setError(recoverFromUnexpectedEOF(recover()))
641641
}()
642642

643643
switch msg.ECstrike15UserMessages(um.MsgType) {
@@ -703,7 +703,7 @@ var frameParsedToken = new(frameParsedTokenType)
703703

704704
func (p *Parser) handleFrameParsed(*frameParsedTokenType) {
705705
defer func() {
706-
p.setError(recoverFromPanic(recover()))
706+
p.setError(recoverFromUnexpectedEOF(recover()))
707707
}()
708708

709709
for k, rp := range p.rawPlayers {

parsing.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,24 @@ func (p *Parser) ParseHeader() (common.DemoHeader, error) {
5252
return h, nil
5353
}
5454

55+
// Parsing errors
56+
var (
57+
// ErrCancelled signals that parsing was cancelled via Parser.Cancel()
58+
ErrCancelled error = errors.New("Parsing was cancelled before it finished (ErrCancelled)")
59+
60+
// ErrUnexpectedEndOfDemo signals that the demo is incomplete / corrupt -
61+
// these demos may still be useful, check the how far the parser got.
62+
ErrUnexpectedEndOfDemo error = errors.New("Demo stream ended unexpectedly (ErrUnexpectedEndOfDemo)")
63+
)
64+
5565
// ParseToEnd attempts to parse the demo until the end.
56-
// Aborts and returns an error if Cancel() is called before the end.
66+
// Aborts and returns ErrCancelled if Cancel() is called before the end.
67+
// May return ErrUnexpectedEndOfDemo for incomplete / corrupt demos.
5768
// May panic if the demo is corrupt in some way.
5869
func (p *Parser) ParseToEnd() (err error) {
5970
defer func() {
6071
if err == nil {
61-
err = recoverFromPanic(recover())
72+
err = recoverFromUnexpectedEOF(recover())
6273
}
6374
}()
6475

@@ -69,7 +80,7 @@ func (p *Parser) ParseToEnd() (err error) {
6980
for {
7081
select {
7182
case <-p.cancelChan:
72-
return errors.New("Parsing was cancelled before it finished")
83+
return ErrCancelled
7384

7485
default:
7586
if !p.parseFrame() {
@@ -89,13 +100,12 @@ func (p *Parser) ParseToEnd() (err error) {
89100
}
90101
}
91102

92-
func recoverFromPanic(r interface{}) error {
103+
func recoverFromUnexpectedEOF(r interface{}) error {
93104
if r != nil {
94105
if r == io.ErrUnexpectedEOF {
95-
return io.ErrUnexpectedEOF
96-
} else {
97-
panic(r)
106+
return ErrUnexpectedEndOfDemo
98107
}
108+
panic(r)
99109
}
100110
return nil
101111
}
@@ -107,12 +117,13 @@ func (p *Parser) Cancel() {
107117
}
108118

109119
// ParseNextFrame attempts to parse the next frame / demo-tick (not ingame tick).
110-
// Returns true unless the demo command 'stop' was encountered.
120+
// Returns true unless the demo command 'stop' or an error was encountered.
121+
// May return ErrUnexpectedEndOfDemo for incomplete / corrupt demos.
111122
// Panics if header hasn't been parsed yet - see Parser.ParseHeader().
112123
func (p *Parser) ParseNextFrame() (b bool, err error) {
113124
defer func() {
114125
if err == nil {
115-
err = recoverFromPanic(recover())
126+
err = recoverFromUnexpectedEOF(recover())
116127
}
117128
}()
118129

0 commit comments

Comments
 (0)