Start of priority processing. Untested.
diff --git a/server.go b/server.go
index 5225c44..7d4da77 100644
--- a/server.go
+++ b/server.go
@@ -275,6 +275,8 @@
cw closeWaiter // closed wait stream transitions to closed state
// owned by serverConn's serve loop:
+ parent *stream // or nil
+ weight uint8
state streamState
bodyBytes int64 // body bytes seen so far
declBodyBytes int64 // or -1 if undeclared
@@ -816,6 +818,8 @@
return sc.processData(f)
case *RSTStreamFrame:
return sc.processResetStream(f)
+ case *PriorityFrame:
+ return sc.processPriority(f)
default:
log.Printf("Ignoring frame: %v", f.Header())
return nil
@@ -1056,6 +1060,9 @@
st.state = stateHalfClosedRemote
}
sc.streams[id] = st
+ if f.HasPriority() {
+ sc.adjustStreamPriority(st.id, f.Priority)
+ }
sc.curOpenStreams++
sc.req = requestParam{
stream: st,
@@ -1104,6 +1111,31 @@
return nil
}
+func (sc *serverConn) processPriority(f *PriorityFrame) error {
+ sc.adjustStreamPriority(f.StreamID, f.PriorityParam)
+ return nil
+}
+
+func (sc *serverConn) adjustStreamPriority(streamID uint32, priority PriorityParam) {
+ // TODO: untested
+ st, ok := sc.streams[streamID]
+ if !ok {
+ // TODO: not quite correct (this streamID might
+ // already exist in the dep tree, but be closed), but
+ // close enough for now.
+ return
+ }
+ st.weight = priority.Weight
+ st.parent = sc.streams[priority.StreamDep] // might be nil
+ if priority.Exclusive && st.parent != nil {
+ for _, openStream := range sc.streams {
+ if openStream.parent == st.parent {
+ openStream.parent = st
+ }
+ }
+ }
+}
+
// resetPendingRequest zeros out all state related to a HEADERS frame
// and its zero or more CONTINUATION frames sent to start a new
// request.