mirror of
https://github.com/buger/goreplay.git
synced 2024-04-21 12:32:02 +00:00
update 100-continue logic to support different header placement
This commit is contained in:
+2
-2
@@ -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
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user