Work ParseGetWork(WebResponse webResponse)
{
// obtain and update current block number
uint blockNumber = 0;
if (webResponse.Headers["X-Blocknum"] != null)
CurrentBlockNumber = blockNumber = uint.Parse(webResponse.Headers["X-Blocknum"]);
// parse and update long poll url value if present
var longPollUrlStr = webResponse.Headers["X-Long-Polling"];
if (longPollUrlStr == null)
longPollUrl = null;
else if (longPollUrlStr == "")
longPollUrl = url;
else if (longPollUrlStr.StartsWith("http:") || longPollUrlStr.StartsWith("https:"))
longPollUrl = new Uri(longPollUrlStr);
else
longPollUrl = new Uri(url, longPollUrlStr);
// longPollUrl does not specify user info, but userinfo was required on initial url
if (string.IsNullOrWhiteSpace(longPollUrl.UserInfo) && !string.IsNullOrWhiteSpace(url.UserInfo))
{
var b = new UriBuilder(longPollUrl);
var u = url.UserInfo
.Split(':')
.Select(i => HttpUtility.UrlDecode(i))
.ToArray();
if (u.Length >= 2)
{
b.UserName = u[0];
b.Password = u[1];
}
longPollUrl = b.Uri;
}
// retrieve invocation response
using (var txt = new StreamReader(webResponse.GetResponseStream()))
using (var rdr = new JsonTextReader(txt))
{
if (!rdr.MoveToContent() && rdr.Read())
throw new JsonException("Unexpected content from 'getwork'.");
var response = JsonConvert.Import<JsonGetWork>(rdr);
if (response == null)
throw new JsonException("No response returned.");
if (response.Error != null)
Console.WriteLine("JSON-RPC: {0}", response.Error);
var result = response.Result;
if (result == null)
return null;
// decode data
var data = Memory.Decode(result.Data);
if (data.Length != 128)
throw new InvalidDataException("Received data is not valid.");
// extract only header portion
var header = new byte[80];
Array.Copy(data, header, 80);
// decode target
var target = Memory.Decode(result.Target);
if (target.Length != 32)
throw new InvalidDataException("Received target is not valid.");
// generate new work instance
var work = new Work()
{
Pool = this,
BlockNumber = blockNumber,
Header = header,
Target = target,
};
// release connection
webResponse.Close();
return work;
}
}