update 100-continue logic to support different header placement

This commit is contained in:
Joseph Lawson
2016-06-20 16:58:36 -04:00
parent 5d2cc68fff
commit 0089892b26
2 changed files with 31 additions and 25 deletions
+2 -2
View File
@@ -144,12 +144,12 @@ func header(payload []byte, name []byte) (value []byte, headerStart, headerEnd,
valueEnd = valueStart + bytes.IndexByte(payload[valueStart:], '\n')
if payload[headerEnd-1] == '\r' {
valueEnd -= 1
valueEnd--
}
for valueStart < valueEnd { // ignore empty space at end of header value
if payload[valueEnd-1] == ' ' {
valueEnd -= 1
valueEnd--
} else {
break
}
+29 -23
View File
@@ -28,6 +28,7 @@ import (
"strings"
"sync"
"time"
"github.com/buger/gor/proto"
)
var _ = fmt.Println
@@ -515,8 +516,10 @@ func (t *Listener) isValidPacket(buf []byte) bool {
return false
}
var bExpect100ContinueCheck = []byte("Expect: 100-continue")
var bExpectHeader = []byte("Expect:")
var bExpect100Value = []byte("100-continue")
var bPOST = []byte("POST")
var bCRLFx2 = []byte("\r\n\r\n")
// Trying to add packet to existing message or creating new message
//
@@ -590,33 +593,36 @@ func (t *Listener) processTCPPacket(packet *TCPPacket) {
// Handling Expect: 100-continue requests
if len(packet.Data) > 4 && bytes.Equal(packet.Data[0:4], bPOST) {
// reading last 20 bytes (not counting CRLF): last header value (if no body presented)
if bytes.Equal(packet.Data[len(packet.Data)-24:len(packet.Data)-4], bExpect100ContinueCheck) {
seq := packet.Seq + uint32(len(packet.Data))
t.seqWithData[seq] = packet.Ack
message.DataSeq = seq
// reading last 8 bytes for double CRLF
if bytes.Equal(packet.Data[len(packet.Data)-4:], bCRLFx2) {
// look for an expect:100-continue header
if bytes.Equal(bExpect100Value, proto.Header(packet.Data, bExpectHeader)) {
seq := packet.Seq + uint32(len(packet.Data))
t.seqWithData[seq] = packet.Ack
message.DataSeq = seq
// In case if sequence packet came first
for _, m := range t.messages {
if m.Seq == seq {
t.deleteMessage(m)
if m.AssocMessage != nil {
message.AssocMessage = m.AssocMessage
}
// log.Println("2: Adding ack alias:", m.Ack, packet.Ack)
t.ackAliases[m.Ack] = packet.Ack
// In case if sequence packet came first
for _, m := range t.messages {
if m.Seq == seq {
t.deleteMessage(m)
if m.AssocMessage != nil {
message.AssocMessage = m.AssocMessage
}
// log.Println("2: Adding ack alias:", m.Ack, packet.Ack)
t.ackAliases[m.Ack] = packet.Ack
for _, pkt := range m.packets {
pkt.UpdateAck(packet.Ack)
message.AddPacket(pkt)
for _, pkt := range m.packets {
pkt.UpdateAck(packet.Ack)
message.AddPacket(pkt)
}
}
}
// Removing `Expect: 100-continue` header
packet.Data = proto.DelHeader(packet.Data, bExpectHeader)
// log.Println(string(packet.Data))
}
// Removing `Expect: 100-continue` header
packet.Data = append(packet.Data[:len(packet.Data)-24], packet.Data[len(packet.Data)-2:]...)
// log.Println(string(packet.Data))
}
}