=htc compact outgoing ByteStrings in parsers to avoid referencing more memory than necessary
This was discussed previously in the context of spray where we came to the conclusion that it makes sense to deliver compact ByteStrings on API boundaries to avoid to carry around unused parts of ByteStrings.
This commit is contained in:
parent
a26670a58e
commit
751190f084
3 changed files with 6 additions and 6 deletions
|
|
@ -170,11 +170,11 @@ private[http] abstract class HttpMessageParser[Output >: MessageOutput <: Parser
|
||||||
val remainingInputBytes = input.length - bodyStart
|
val remainingInputBytes = input.length - bodyStart
|
||||||
if (remainingInputBytes > 0) {
|
if (remainingInputBytes > 0) {
|
||||||
if (remainingInputBytes < remainingBodyBytes) {
|
if (remainingInputBytes < remainingBodyBytes) {
|
||||||
emit(EntityPart(input drop bodyStart))
|
emit(EntityPart(input.drop(bodyStart).compact))
|
||||||
continue(parseFixedLengthBody(remainingBodyBytes - remainingInputBytes, isLastMessage))
|
continue(parseFixedLengthBody(remainingBodyBytes - remainingInputBytes, isLastMessage))
|
||||||
} else {
|
} else {
|
||||||
val offset = bodyStart + remainingBodyBytes.toInt
|
val offset = bodyStart + remainingBodyBytes.toInt
|
||||||
emit(EntityPart(input.slice(bodyStart, offset)))
|
emit(EntityPart(input.slice(bodyStart, offset).compact))
|
||||||
emit(MessageEnd)
|
emit(MessageEnd)
|
||||||
setCompletionHandling(CompletionOk)
|
setCompletionHandling(CompletionOk)
|
||||||
if (isLastMessage) terminate()
|
if (isLastMessage) terminate()
|
||||||
|
|
@ -211,7 +211,7 @@ private[http] abstract class HttpMessageParser[Output >: MessageOutput <: Parser
|
||||||
if (chunkSize > 0) {
|
if (chunkSize > 0) {
|
||||||
val chunkBodyEnd = cursor + chunkSize
|
val chunkBodyEnd = cursor + chunkSize
|
||||||
def result(terminatorLen: Int) = {
|
def result(terminatorLen: Int) = {
|
||||||
emit(EntityChunk(HttpEntity.Chunk(input.slice(cursor, chunkBodyEnd), extension)))
|
emit(EntityChunk(HttpEntity.Chunk(input.slice(cursor, chunkBodyEnd).compact, extension)))
|
||||||
Trampoline(_ ⇒ parseChunk(input, chunkBodyEnd + terminatorLen, isLastMessage))
|
Trampoline(_ ⇒ parseChunk(input, chunkBodyEnd + terminatorLen, isLastMessage))
|
||||||
}
|
}
|
||||||
byteChar(input, chunkBodyEnd) match {
|
byteChar(input, chunkBodyEnd) match {
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ private[http] class HttpResponseParser(_settings: ParserSettings, _headerParser:
|
||||||
// currently we do not check for `settings.maxContentLength` overflow
|
// currently we do not check for `settings.maxContentLength` overflow
|
||||||
def parseToCloseBody(input: ByteString, bodyStart: Int): StateResult = {
|
def parseToCloseBody(input: ByteString, bodyStart: Int): StateResult = {
|
||||||
if (input.length > bodyStart)
|
if (input.length > bodyStart)
|
||||||
emit(EntityPart(input drop bodyStart))
|
emit(EntityPart(input.drop(bodyStart).compact))
|
||||||
continue(parseToCloseBody)
|
continue(parseToCloseBody)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -87,7 +87,7 @@ private[http] class FrameEventParser extends ByteStringParserStage[FrameEvent] {
|
||||||
if (thisFrameData.length == length) ReadFrameHeader
|
if (thisFrameData.length == length) ReadFrameHeader
|
||||||
else readData(length - thisFrameData.length)
|
else readData(length - thisFrameData.length)
|
||||||
|
|
||||||
pushAndBecomeWithRemaining(FrameStart(header, thisFrameData), nextState, remaining, ctx)
|
pushAndBecomeWithRemaining(FrameStart(header, thisFrameData.compact), nextState, remaining, ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,7 +103,7 @@ private[http] class FrameEventParser extends ByteStringParserStage[FrameEvent] {
|
||||||
val frameData = elem.take(remaining.toInt)
|
val frameData = elem.take(remaining.toInt)
|
||||||
val remainingData = elem.drop(remaining.toInt)
|
val remainingData = elem.drop(remaining.toInt)
|
||||||
|
|
||||||
pushAndBecomeWithRemaining(FrameData(frameData, lastPart = true), ReadFrameHeader, remainingData, ctx)
|
pushAndBecomeWithRemaining(FrameData(frameData.compact, lastPart = true), ReadFrameHeader, remainingData, ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue