BitMaker.Miner.Pool.ParseGetWork C# (CSharp) Method

ParseGetWork() private method

Parses a WebResponse containing the results of a 'getwork' request.
private ParseGetWork ( WebResponse webResponse ) : BitMaker.Miner.Work
webResponse System.Net.WebResponse
return BitMaker.Miner.Work
        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;
            }
        }