public static PaymentACK Load(Stream source) { if (source.CanSeek && source.Length > MaxLength) { throw new ArgumentOutOfRangeException("PaymentACK messages larger than " + MaxLength + " bytes should be rejected", "source"); } PaymentACK ack = new PaymentACK(); Protobuf.ProtobufReaderWriter reader = new Protobuf.ProtobufReaderWriter(source); int key; while (reader.TryReadKey(out key)) { switch (key) { case 1: var bytes = reader.ReadBytes(); ack.Payment = PaymentMessage.Load(bytes); break; case 2: ack.Memo = reader.ReadString(); break; default: break; } } return(ack); }
public async Task <PaymentACK> SubmitPaymentAsync(Uri paymentUrl, HttpClient httpClient) { bool own = false; if (paymentUrl == null) { paymentUrl = ImplicitPaymentUrl; } if (paymentUrl == null) { throw new ArgumentNullException("paymentUrl"); } if (httpClient == null) { httpClient = new HttpClient(); own = true; } try { var request = new HttpRequestMessage(HttpMethod.Post, paymentUrl.OriginalString); request.Headers.Clear(); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(PaymentACK.MediaType)); request.Content = new ByteArrayContent(this.ToBytes()); request.Content.Headers.ContentType = new MediaTypeHeaderValue(PaymentMessage.MediaType); var result = await httpClient.SendAsync(request).ConfigureAwait(false); if (!result.IsSuccessStatusCode) { throw new WebException(result.StatusCode + "(" + (int)result.StatusCode + ")"); } if (result.Content.Headers.ContentType == null || !result.Content.Headers.ContentType.MediaType.Equals(PaymentACK.MediaType, StringComparison.OrdinalIgnoreCase)) { throw new WebException("Invalid contenttype received, expecting " + PaymentACK.MediaType + ", but got " + result.Content.Headers.ContentType); } var response = await result.Content.ReadAsStreamAsync().ConfigureAwait(false); return(PaymentACK.Load(response)); } finally { if (own) { httpClient.Dispose(); } } }