func (f httpStreamFactory) New(net, transport gopacket.Flow) tcpassembly.Stream { src := transport.Src().String() if src == strconv.Itoa(f.port) { hstream := &responseStream{ net: net, transport: transport, r: tcpreader.NewReaderStream(), } go hstream.run() return &hstream.r } else { hstream := &requestStream{ net: net, transport: transport, r: tcpreader.NewReaderStream(), } go hstream.run() return &hstream.r } }
// New handles creating a new tcpassembly.Stream. func (f *myFactory) New(netFlow, tcpFlow gopacket.Flow) tcpassembly.Stream { // Create a new stream. s := &myStream{} // Find the bidi bidirectional struct for this stream, creating a new one if // one doesn't already exist in the map. k := key{netFlow, tcpFlow} bd := f.bidiMap[k] if bd == nil { bd = &bidi{a: s, key: k} log.Printf("[%v] created first side of bidirectional stream", bd.key) // Register bidirectional with the reverse key, so the matching stream going // the other direction will find it. f.bidiMap[key{netFlow.Reverse(), tcpFlow.Reverse()}] = bd } else { log.Printf("[%v] found second side of bidirectional stream", bd.key) bd.b = s // Clear out the bidi we're using from the map, just in case. delete(f.bidiMap, k) } s.bidi = bd return s }