public async Task Controller_WithValidCloudEvent_NoContent_DeserializesUsingPipeline(ContentMode contentMode) { // Arrange var expectedExtensionKey = "comexampleextension1"; var expectedExtensionValue = Guid.NewGuid().ToString(); var cloudEvent = new CloudEvent { Type = "test-type-æøå", Source = new Uri("urn:integration-tests"), Id = Guid.NewGuid().ToString(), DataContentType = "application/json", Data = new { key1 = "value1" }, [expectedExtensionKey] = expectedExtensionValue }; var httpContent = new CloudEventHttpContent(cloudEvent, contentMode, new JsonEventFormatter()); // Act var result = await _factory.CreateClient().PostAsync("/api/events/receive", httpContent); // Assert string resultContent = await result.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Contains(cloudEvent.Id, resultContent); Assert.Contains(cloudEvent.Type, resultContent); Assert.Contains($"\"{expectedExtensionKey}\": \"{expectedExtensionValue}\"", resultContent); }
public void NoContentType_NoContent() { var cloudEvent = CreateEmptyCloudEvent(); var content = new CloudEventHttpContent(cloudEvent, ContentMode.Binary, new JsonEventFormatter()); Assert.Null(content.Headers.ContentType); }
public void ContentType_FromCloudEvent_BinaryMode() { var cloudEvent = CreateEmptyCloudEvent(); cloudEvent.DataContentType = "text/plain"; var content = new CloudEventHttpContent(cloudEvent, ContentMode.Binary, new JsonEventFormatter()); var expectedContentType = new MediaTypeHeaderValue("text/plain"); Assert.Equal(expectedContentType, content.Headers.ContentType); }
private async Task OnExecuteAsync() { var cloudEvent = new CloudEvent { Type = Type, Source = new Uri(Source), DataContentType = MediaTypeNames.Application.Json, Data = JsonConvert.SerializeObject("hey there!") }; var content = new CloudEventHttpContent(cloudEvent, ContentMode.Structured, new JsonEventFormatter()); var httpClient = new HttpClient(); // your application remains in charge of adding any further headers or // other information required to authenticate/authorize or otherwise // dispatch the call at the server. var result = (await httpClient.PostAsync(this.Url, content)); Console.WriteLine(result.StatusCode); }
public async Task HttpBinaryClientSendTest() { var cloudEvent = new CloudEvent { Type = "com.github.pull.create", Source = new Uri("https://github.com/cloudevents/spec/pull/123"), Id = "A234-1234-1234", Time = SampleTimestamp, DataContentType = MediaTypeNames.Text.Xml, Data = "<much wow=\"xml\"/>", ["comexampleextension1"] = "value", ["utf8examplevalue"] = "æøå" }; string ctx = Guid.NewGuid().ToString(); var content = new CloudEventHttpContent(cloudEvent, ContentMode.Binary, new JsonEventFormatter()); content.Headers.Add(TestContextHeader, ctx); PendingRequests.TryAdd(ctx, context => { try { Assert.True(context.Request.IsCloudEvent()); var receivedCloudEvent = context.Request.ToCloudEvent(new JsonEventFormatter()); Assert.Equal(CloudEventsSpecVersion.V1_0, receivedCloudEvent.SpecVersion); Assert.Equal("com.github.pull.create", receivedCloudEvent.Type); Assert.Equal(new Uri("https://github.com/cloudevents/spec/pull/123"), receivedCloudEvent.Source); Assert.Equal("A234-1234-1234", receivedCloudEvent.Id); AssertTimestampsEqual(SampleTimestamp, cloudEvent.Time.Value); Assert.Equal(MediaTypeNames.Text.Xml, receivedCloudEvent.DataContentType); // The non-ASCII attribute value should have been URL-encoded using UTF-8 for the header. Assert.True(content.Headers.TryGetValues("ce-utf8examplevalue", out var utf8ExampleValues)); Assert.Equal("%C3%A6%C3%B8%C3%A5", utf8ExampleValues.Single()); Assert.Equal("<much wow=\"xml\"/>", receivedCloudEvent.Data); Assert.Equal("value", receivedCloudEvent["comexampleextension1"]); // The non-ASCII attribute value should have been correctly URL-decoded. Assert.Equal("æøå", receivedCloudEvent["utf8examplevalue"]); context.Response.StatusCode = (int)HttpStatusCode.NoContent; } catch (Exception e) { using (var sw = new StreamWriter(context.Response.OutputStream)) { sw.Write(e.ToString()); context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; } } context.Response.Close(); return(Task.CompletedTask); }); var httpClient = new HttpClient(); var result = await httpClient.PostAsync(new Uri(ListenerAddress + "ep"), content); if (result.StatusCode != HttpStatusCode.NoContent) { throw new InvalidOperationException(result.Content.ReadAsStringAsync().GetAwaiter().GetResult()); } }
public async Task HttpStructuredClientSendTest() { var cloudEvent = new CloudEvent { Type = "com.github.pull.create", Source = new Uri("https://github.com/cloudevents/spec/pull/123"), Id = "A234-1234-1234", Time = SampleTimestamp, DataContentType = MediaTypeNames.Text.Xml, Data = "<much wow=\"xml\"/>", ["comexampleextension1"] = "value", ["utf8examplevalue"] = "æøå" }; string ctx = Guid.NewGuid().ToString(); var content = new CloudEventHttpContent(cloudEvent, ContentMode.Structured, new JsonEventFormatter()); content.Headers.Add(TestContextHeader, ctx); PendingRequests.TryAdd(ctx, context => { try { // Structured events contain a copy of the CloudEvent attributes as HTTP headers. var headers = context.Request.Headers; Assert.Equal("1.0", headers["ce-specversion"]); Assert.Equal("com.github.pull.create", headers["ce-type"]); Assert.Equal("https://github.com/cloudevents/spec/pull/123", headers["ce-source"]); Assert.Equal("A234-1234-1234", headers["ce-id"]); Assert.Equal("2018-04-05T17:31:00Z", headers["ce-time"]); // Note that datacontenttype is mapped in this case, but would not be included in binary mode. Assert.Equal("text/xml", headers["ce-datacontenttype"]); Assert.Equal("application/cloudevents+json; charset=utf-8", context.Request.ContentType); Assert.Equal("value", headers["ce-comexampleextension1"]); // The non-ASCII attribute value should have been URL-encoded using UTF-8 for the header. Assert.Equal("%C3%A6%C3%B8%C3%A5", headers["ce-utf8examplevalue"]); var receivedCloudEvent = context.Request.ToCloudEvent(new JsonEventFormatter()); Assert.Equal(CloudEventsSpecVersion.V1_0, receivedCloudEvent.SpecVersion); Assert.Equal("com.github.pull.create", receivedCloudEvent.Type); Assert.Equal(new Uri("https://github.com/cloudevents/spec/pull/123"), receivedCloudEvent.Source); Assert.Equal("A234-1234-1234", receivedCloudEvent.Id); AssertTimestampsEqual(SampleTimestamp, cloudEvent.Time.Value); Assert.Equal(MediaTypeNames.Text.Xml, receivedCloudEvent.DataContentType); Assert.Equal("<much wow=\"xml\"/>", receivedCloudEvent.Data); Assert.Equal("value", receivedCloudEvent["comexampleextension1"]); Assert.Equal("æøå", receivedCloudEvent["utf8examplevalue"]); context.Response.StatusCode = (int)HttpStatusCode.NoContent; } catch (Exception e) { using (var sw = new StreamWriter(context.Response.OutputStream)) { sw.Write(e.ToString()); context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; } } context.Response.Close(); return(Task.CompletedTask); }); var httpClient = new HttpClient(); var result = (await httpClient.PostAsync(new Uri(ListenerAddress + "ep"), content)); if (result.StatusCode != HttpStatusCode.NoContent) { throw new InvalidOperationException(result.Content.ReadAsStringAsync().GetAwaiter().GetResult()); } }