- Goals of this course
- Why Spicy?
- Prerequisites
- Spicy language
- Hello world
- Basic types
- Boolean and integers
- Optional
- Bytes and strings
- Collections
- User-defined types: Enums and structs
- Exercises
- Variables
- Conditionals and loops
- Functions
- Exercises
- Modules revisited
- Parsing
- Structure of a parser
- Attributes
- Extracting data without storing it
- Hooks
- Conditional parsing
- Controlling byte order
- Parsing types
- Exercise: A naive CSV parser
- Adding additional parser state
- Lookahead parsing
- Error recovery
- Integrating with Zeek
- Protocol analyzers
- Message and connection semantics
- Analyzer lifecycle
- Passing data to Zeek
- Forwarding to other analyzers
- Sharing data across the same connection
- Exercises
- Testing
- Parser unit testing
- Testing parsers with shared state
- Day-2 parser operation
- Debugging
- Logging basic parser operation
- Exercise: Input not matching parser grammar
- Profiling
- High-level profiling
- Low-level profiling
- Project: IRC
- Collect data for channel membership analysis
- Zeek: Log very active users
- Sensitive messages
- Resources