diff --git a/proto/proto.go b/proto/proto.go index 4e15a5a..5376473 100644 --- a/proto/proto.go +++ b/proto/proto.go @@ -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 } diff --git a/raw_socket_listener/listener.go b/raw_socket_listener/listener.go index 59bbcf9..e1b0a29 100644 --- a/raw_socket_listener/listener.go +++ b/raw_socket_listener/listener.go @@ -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)) } }