in Sources/NIOHTTP1/HTTPDecoder.swift [356:405]
func feedInput(_ bytes: UnsafeRawBufferPointer?) throws -> Int {
var parserErrno: UInt32 = 0
let parserConsumed = self.withExclusiveHTTPParser { parserPtr -> Int in
let parserResult: Int
if let bytes = bytes {
self.rawBytesView = bytes
defer {
self.rawBytesView = .init(start: UnsafeRawPointer(bitPattern: 0xdafbabe), count: 0)
}
parserResult = c_nio_http_parser_execute_swift(parserPtr,
&self.settings,
bytes.baseAddress! + self.httpParserOffset,
bytes.count - self.httpParserOffset)
} else {
parserResult = c_nio_http_parser_execute(parserPtr, &self.settings, nil, 0)
}
parserErrno = parserPtr.pointee.http_errno
return parserResult
}
assert(parserConsumed >= 0)
// self.parser must be non-nil here because we can't be re-entered here (ByteToMessageDecoder guarantee)
guard parserErrno == 0 else {
// if we chose to abort (eg. wrong HTTP version) the error will be in self.httpErrno, otherwise http_parser
// will tell us...
// self.parser must be non-nil here because we can't be re-entered here (ByteToMessageDecoder guarantee)
// If we have a richer error than the errno code, and the errno is unknown, we'll use it. Otherwise, we use the
// error from http_parser.
let err = self.httpErrno ?? http_errno(rawValue: parserErrno)
if err == HPE_UNKNOWN, let richerError = self.richerError {
throw richerError
} else {
throw HTTPParserError.httpError(fromCHTTPParserErrno: err)!
}
}
if let firstNonDiscardableOffset = self.firstNonDiscardableOffset {
self.httpParserOffset += parserConsumed - firstNonDiscardableOffset
self.firstNonDiscardableOffset = 0
return firstNonDiscardableOffset
} else {
// By definition we've consumed all of the http parser offset at this stage. There may still be bytes
// left in the buffer though: we didn't consume them because they aren't ours to consume, as they may belong
// to an upgraded protocol.
//
// Set the HTTP parser offset back to zero, and tell the parent that we consumed
// the whole buffer.
let consumedBytes = self.httpParserOffset + parserConsumed
self.httpParserOffset = 0
return consumedBytes
}
}