go.net/spdy: disallow stream id 0

Per 2.3.2 of draft-mbelshe-httpbis-spdy-00.

R=mikioh.mikioh, bradfitz
CC=adg, golang-dev
https://golang.org/cl/6781053
diff --git a/spdy/write.go b/spdy/write.go
index 3dd2ca1..3b0ce6a 100644
--- a/spdy/write.go
+++ b/spdy/write.go
@@ -20,6 +20,9 @@
 }
 
 func (frame *RstStreamFrame) write(f *Framer) (err error) {
+	if frame.StreamId == 0 {
+		return &Error{ZeroStreamId, 0}
+	}
 	frame.CFHeader.version = Version
 	frame.CFHeader.frameType = TypeRstStream
 	frame.CFHeader.length = 8
@@ -70,6 +73,9 @@
 }
 
 func (frame *PingFrame) write(f *Framer) (err error) {
+	if frame.Id == 0 {
+		return &Error{ZeroStreamId, 0}
+	}
 	frame.CFHeader.version = Version
 	frame.CFHeader.frameType = TypePing
 	frame.CFHeader.length = 4
@@ -100,10 +106,16 @@
 }
 
 func (frame *HeadersFrame) write(f *Framer) error {
+	if frame.StreamId == 0 {
+		return &Error{ZeroStreamId, 0}
+	}
 	return f.writeHeadersFrame(frame)
 }
 
 func (frame *DataFrame) write(f *Framer) error {
+	if frame.StreamId == 0 {
+		return &Error{ZeroStreamId, 0}
+	}
 	return f.writeDataFrame(frame)
 }
 
@@ -156,6 +168,9 @@
 }
 
 func (f *Framer) writeSynStreamFrame(frame *SynStreamFrame) (err error) {
+	if frame.StreamId == 0 {
+		return &Error{ZeroStreamId, 0}
+	}
 	// Marshal the headers.
 	var writer io.Writer = f.headerBuf
 	if !f.headerCompressionDisabled {
@@ -194,6 +209,9 @@
 }
 
 func (f *Framer) writeSynReplyFrame(frame *SynReplyFrame) (err error) {
+	if frame.StreamId == 0 {
+		return &Error{ZeroStreamId, 0}
+	}
 	// Marshal the headers.
 	var writer io.Writer = f.headerBuf
 	if !f.headerCompressionDisabled {