| 61 | }; |
| 62 | |
| 63 | Result saneMain(Span<StringSpan> args) |
| 64 | { |
| 65 | Console console; |
| 66 | Console::tryAttachingToParentConsole(); |
| 67 | |
| 68 | if (args.sizeInElements() < 1) |
| 69 | { |
| 70 | console.print("Usage: HttpClientAsyncGet <url>\n"); |
| 71 | console.print(" Example: HttpClientAsyncGet https://example.com\n"); |
| 72 | return Result::Error("Missing URL argument"); |
| 73 | } |
| 74 | |
| 75 | AsyncEventLoop loop; |
| 76 | SC_TRY(loop.create()); |
| 77 | |
| 78 | HttpClient client; |
| 79 | SC_TRY(client.init()); |
| 80 | |
| 81 | HttpClientResponseBuffer responseBuffers[8]; |
| 82 | HttpClientOperationEvent eventQueue[16]; |
| 83 | AsyncBufferView asyncResponseBuffers[8]; |
| 84 | AsyncReadableStream::Request responseReadQueue[8]; |
| 85 | AsyncWritableStream::Request requestWriteQueue[4]; |
| 86 | |
| 87 | char responseMemory[64 * 1024]; |
| 88 | char responseHeaders[8 * 1024]; |
| 89 | char responseMetadata[4 * 1024]; |
| 90 | char backendScratch[16 * 1024]; |
| 91 | |
| 92 | HttpClientOperationMemory operationMemory; |
| 93 | operationMemory.responseBuffers = {responseBuffers, 8}; |
| 94 | operationMemory.responseBufferMemory = {responseMemory, sizeof(responseMemory)}; |
| 95 | operationMemory.eventQueue = {eventQueue, 16}; |
| 96 | operationMemory.responseHeaders = {responseHeaders, sizeof(responseHeaders)}; |
| 97 | operationMemory.responseMetadata = {responseMetadata, sizeof(responseMetadata)}; |
| 98 | operationMemory.backendScratch = {backendScratch, sizeof(backendScratch)}; |
| 99 | |
| 100 | HttpClientAsyncOperationMemoryT<AsyncStreams> asyncMemory; |
| 101 | asyncMemory.responseBuffers = {asyncResponseBuffers, 8}; |
| 102 | asyncMemory.responseBufferMemory = {responseMemory, sizeof(responseMemory)}; |
| 103 | asyncMemory.responseReadQueue = {responseReadQueue, 8}; |
| 104 | asyncMemory.requestWriteQueue = {requestWriteQueue, 4}; |
| 105 | |
| 106 | AsyncHttpClientOperation operation; |
| 107 | SC_TRY(operation.init(client, loop, operationMemory, asyncMemory)); |
| 108 | |
| 109 | HttpClientRequest request; |
| 110 | request.url = args[0]; |
| 111 | request.options.timeouts.requestTimeoutMs = 30000; |
| 112 | |
| 113 | HttpClientResponse response; |
| 114 | char body[256 * 1024]; |
| 115 | AsyncResponseCollector collector; |
| 116 | collector.operation = &operation; |
| 117 | collector.body = {body, sizeof(body)}; |
| 118 | |
| 119 | const bool dataAdded = |
| 120 | operation.getResponseBodyStream() |