#define DJSTD_BASIC_ENTRY #include "core.c" int djstd_entry(Arena *arena, StringList args) { Socket sock = socketConnect(arena, (SocketConnectInfo){ .address="::1", .port=8080, .blocking=true }); string newLine = s("\r\n"); string lines[] = { s("GET / HTTP/1.1"), s("Host: localhost"), }; for (EachInArray(lines, i)) { socketWriteStr(&sock, lines[i]); socketWriteStr(&sock, newLine); } socketWriteStr(&sock, newLine); CharList body = EmptyList(); bool streamingBody = false; Forever { StringResult response = socketReadStr(arena, &sock); if (response.valid) { if (streamingBody) { if (body.capacity - body.length >= response.result.length) { memcpy(body.data + body.length, response.result.str, response.result.length); body.length += response.result.length; } } else { StringList lines = strSplit(arena, s("\r\n"), response.result); for (EachEl(lines, string, line)) { if (body.capacity > 0 && strEql(*line, s(""))) { streamingBody = true; } else if (streamingBody && (body.capacity - body.length) >= line->length) { // TODO(dledda): append list to list, string to string, whatever // TODO(dledda): `joinStringList` memcpy(body.data + body.length, line->str, line->length); body.length += line->length; } else { // TODO(dledda): `strContains` // TODO(dledda): `stringContains` -> `strContainsChar` StringList split = strSplit(arena, s("Content-Length: "), *line); if (split.length > 1) { Int32Result lengthResult = parsePositiveInt(split.data[1]); if (lengthResult.valid) { body = PushList(arena, CharList, lengthResult.result); } } } } } } if (streamingBody == true && body.length == body.capacity) { break; } } // TODO(dledda): string from CharList/ByteList // TODO(dledda): `printStr` print("%S", (string){.str=body.data, .length=body.length}); return 0; }