public bool ReadStatusLine(HttpResponseMessage response)
{
if (!_span.StartsWithHttpPrefix())
{
return false;
}
int index = HttpPrefix.Length;
int majorVersion = _span.ReadInt(ref index);
CheckResponseMsgFormat(majorVersion != 0);
CheckResponseMsgFormat(index < _span.Length && _span[index] == '.');
index++;
// Need minor version.
CheckResponseMsgFormat(index < _span.Length && _span[index] >= '0' && _span[index] <= '9');
int minorVersion = _span.ReadInt(ref index);
CheckResponseMsgFormat(_span.SkipSpace(ref index));
// Parse status code.
int statusCode = _span.ReadInt(ref index);
CheckResponseMsgFormat(statusCode >= 100 && statusCode < 1000);
bool foundSpace = _span.SkipSpace(ref index);
CheckResponseMsgFormat(index <= _span.Length);
CheckResponseMsgFormat(foundSpace || index == _span.Length);
// Set the response HttpVersion.
response.Version =
(majorVersion == 1 && minorVersion == 1) ? HttpVersionInternal.Version11 :
(majorVersion == 1 && minorVersion == 0) ? HttpVersionInternal.Version10 :
(majorVersion == 2 && minorVersion == 0) ? HttpVersionInternal.Version20 :
HttpVersionInternal.Unknown;
response.StatusCode = (HttpStatusCode)statusCode;
// Try to use a known reason phrase instead of allocating a new string.
HeaderBufferSpan reasonPhraseSpan = _span.Substring(index);
string knownReasonPhrase = HttpStatusDescription.Get(response.StatusCode);
response.ReasonPhrase = reasonPhraseSpan.EqualsOrdinal(knownReasonPhrase) ?
knownReasonPhrase :
reasonPhraseSpan.ToString();
return true;
}