in iothub/device/src/Common/UrlEncodedDictionarySerializer.cs [207:340]
public IEnumerable<Token> GetTokens()
{
if (_position >= _value.Length)
{
yield break;
}
int readCount = 0;
bool readCompleted = false;
string errorMessage = null;
while (!readCompleted)
{
switch (_currentState)
{
case TokenizerState.ReadyToReadKey:
{
if (_position >= _value.Length)
{
errorMessage = "Unexpected string end in '{0}' state.".FormatInvariant(_currentState);
_currentState = TokenizerState.Error;
break;
}
char currentChar = _value[_position];
switch (currentChar)
{
case '=':
case '&':
errorMessage = "Unexpected character '{0}' in '{1}' state.".FormatInvariant(currentChar, _currentState);
_currentState = TokenizerState.Error;
break;
case '/':
_currentState = TokenizerState.Finish;
break;
default:
readCount++;
_currentState = TokenizerState.ReadKey;
break;
}
break;
}
case TokenizerState.ReadKey:
{
if (_position >= _value.Length)
{
yield return CreateToken(TokenType.Key, readCount);
yield return CreateToken(TokenType.Value, 0);
readCount = 0;
_currentState = TokenizerState.Finish;
break;
}
char currentChar = _value[_position];
switch (currentChar)
{
case '=':
yield return CreateToken(TokenType.Key, readCount);
readCount = 0;
_currentState = TokenizerState.ReadValue;
break;
case '&':
yield return CreateToken(TokenType.Key, readCount);
yield return CreateToken(TokenType.Value, 0);
readCount = 0;
_currentState = TokenizerState.ReadyToReadKey;
break;
case '/':
yield return CreateToken(TokenType.Key, readCount);
yield return CreateToken(TokenType.Value, 0);
readCount = 0;
_currentState = TokenizerState.Finish;
break;
default:
readCount++;
break;
}
break;
}
case TokenizerState.ReadValue:
{
if (_position >= _value.Length)
{
yield return CreateToken(TokenType.Value, readCount);
readCount = 0;
_currentState = TokenizerState.Finish;
break;
}
char currentChar = _value[_position];
switch (currentChar)
{
case '=':
errorMessage = "Unexpected character '{0}' in '{1}' state.".FormatInvariant(currentChar, _currentState);
_currentState = TokenizerState.Error;
break;
case '&':
yield return CreateToken(TokenType.Value, readCount);
readCount = 0;
_currentState = TokenizerState.ReadyToReadKey;
break;
case '/':
yield return CreateToken(TokenType.Value, readCount);
readCount = 0;
_currentState = TokenizerState.Finish;
break;
default:
readCount++;
break;
}
break;
}
case TokenizerState.Finish:
case TokenizerState.Error:
readCompleted = true;
break;
default:
throw new NotSupportedException();
}
_position++;
}
if (_currentState == TokenizerState.Error)
{
throw new FormatException(errorMessage);
}
}