diff --git a/src/dsfml/network/Http.cpp b/src/dsfml/network/Http.cpp index 51d074d..070b52e 100644 --- a/src/dsfml/network/Http.cpp +++ b/src/dsfml/network/Http.cpp @@ -5,3 +5,61 @@ typedef sf::Http::Request sfHttpRequest; +sfHttpRequest* sfHttpRequest_Create(const char* uri, size_t uriLength, unsigned int method, const char* requestBody, size_t requestBodyLength) { + return new sfHttpRequest(std::string(uri, uriLength), sf::Enumeration(method), std::string(requestBody, requestBodyLength)); +} + +void sfHttpRequest_Destroy(sfHttpRequest* request) { + delete request; +} + +void sfHttpRequest_SetField(sfHttpRequest* request, const char* field, size_t fieldLength, const char* value, size_t valueLength) { + request->SetField(std::string(field, fieldLength), std::string(value, valueLength)); +} + +void sfHttpRequest_SetMethod(sfHttpRequest* request, unsigned int method) { + request->SetMethod(sf::Enumeration(method)); +} + +void sfHttpRequest_SetUri(sfHttpRequest* request, const char* uri, size_t uriLength) { + request->SetUri(std::string(uri, uriLength)); +} + +void sfHttpRequest_SetHttpVersion(sfHttpRequest* request, unsigned int major, unsigned int minor) { + request->SetHttpVersion(major, minor); +} + +void sfHttpRequest_SetBody(sfHttpRequest* request, const char* requestBody, size_t requestBodyLength) { + request->SetBody(std::string(requestBody, requestBodyLength)); +} + +typedef sf::Http::Response sfHttpResponse; + +sfHttpResponse* sfHttpResponse_Create() { + return new sfHttpResponse(); +} + +void sfHttpResponse_Destroy(sfHttpResponse* response) { + delete response; +} + +const char* sfHttpResponse_GetField(const sfHttpResponse* response, const char* field, size_t fieldLength) { + return response->GetField(std::string(field, fieldLength)).c_str(); +} + +unsigned int sfHttpResponse_GetStatus(const sfHttpResponse* response) { + return response->GetStatus(); +} + +unsigned int sfHttpResponse_GetMajorHttpVersion(const sfHttpResponse* response) { + return response->GetMajorHttpVersion(); +} + +unsigned int sfHttpResponse_GetMinorHttpVersion(const sfHttpResponse* response) { + return response->GetMinorHttpVersion(); +} + +const char* sfHttpResponse_GetBody(const sfHttpResponse* response) { + return response->GetBody().c_str(); +} + diff --git a/src/dsfml/network/http.d b/src/dsfml/network/http.d index d5fc5c7..462f6ca 100644 --- a/src/dsfml/network/http.d +++ b/src/dsfml/network/http.d @@ -13,6 +13,27 @@ enum Method { Head, } +enum Status { + Ok = 200, + Created = 201, + Accepted = 202, + NoContent = 204, + MultipleChoices = 300, + MovedPermanently = 301, + MovedTemporarily = 302, + NotModified = 304, + BadRequest = 400, + Unauthorized = 401, + Forbidden = 403, + NotFound = 404, + InternalServerError = 500, + NotImplemented = 501, + BadGateway = 502, + ServiceNotAvailable = 503, + InvalidResponse = 1000, + ConnectionFailed = 1001, +} + final class Http { private void[httpSize] data = void; @@ -20,105 +41,130 @@ final class Http { package final inout(sfHttp*) http() inout { return cast(inout(sfHttp)*) &this; } - /* - public this() { - http = sfHttp_Create(); - } - public this(string host, ushort port = 0) { - this(); - - setHost(host, port); - } - - public ~this() { - sfHttp_Destroy(http); - } - - public void setHost(string host, ushort port = 0) { - sfHttp_SetHost(http, toStringz(host), port); - } - - public Response sendRequest(const(Request) request, uint timeout = 0) { - return new Response(request, timeout); - } - - static class Request { + static final class Request { private sfHttpRequest* request; - public this(string uri = "/", sfHttpMethod method = sfHttpMethod.sfHttpGet, string requestBody = "") { - request = sfHttpRequest_Create(); - - setUri(uri); - setMethod(method); - setBody(requestBody); + this(string uri = "/", Method method = Method.Get, string requestBody = "") { + request = sfHttpRequest_Create(uri.ptr, uri.length, method, requestBody.ptr, requestBody.length); } - public ~this() { + ~this() { sfHttpRequest_Destroy(request); } - public void setField(string field, string value) { - sfHttpRequest_SetField(request, toStringz(field), toStringz(value)); - } + // TODO: setfield - public void setMethod(sfHttpMethod method) { + @property + final void method(Method method) { sfHttpRequest_SetMethod(request, method); } - public void setUri(string uri) { - sfHttpRequest_SetUri(request, toStringz(uri)); + @property + final void uri(string uri) { + sfHttpRequest_SetUri(request, uri.ptr, uri.length); } - public void setHttpVersion(uint major, uint minor) { - sfHttpRequest_SetHttpVersion(request, major, minor); - } + // TODO: http version - public void setBody(string requestBody) { - sfHttpRequest_SetBody(request, toStringz(requestBody)); + @property + final void requestBody(string requestBody) { + sfHttpRequest_SetBody(request, requestBody.ptr, requestBody.length); } } - class Response { + static final class Response { private sfHttpResponse* response; - private this(const Request request, uint timeout = 0) { - response = sfHttp_SendRequest(http, request.request, timeout); + this() { + response = sfHttpResponse_Create(); } - public ~this() { + ~this() { sfHttpResponse_Destroy(response); } - public string getField(string field) const { - const(char*) cvalue = sfHttpResponse_GetField(response, toStringz(field)); + final string getField(string field) const { + const char* cfield = sfHttpResponse_GetField(response, field.ptr, field.length); + scope(exit) free(cast(char*) cfield); - return cvalue[0 .. strlen(cvalue)].idup; + return cfield[0 .. strlen(cfield)].idup; } - public sfHttpStatus getStatus() const { - return sfHttpResponse_GetStatus(response); + @property + final Status status() const { + return cast(Status) sfHttpResponse_GetStatus(response); } - public uint getMajorVersion() const { - return sfHttpResponse_GetMajorVersion(response); + @property + final uint majorHttpVersion() const { + return sfHttpResponse_GetMajorHttpVersion(response); } - public uint getMinorVersion() const { - return sfHttpResponse_GetMinorVersion(response); + @property + final uint minorHttpVersion() const { + return sfHttpResponse_GetMinorHttpVersion(response); } - public string getBody() const { - const(char*) cbody = sfHttpResponse_GetBody(response); + @property + final string responseBody() const { + const char* cbody = sfHttpResponse_GetBody(response); + scope(exit) free(cast(char*) cbody); return cbody[0 .. strlen(cbody)].idup; } - }*/ + } + + /* + public this() { + http = sfHttp_Create(); + } + + public this(string host, ushort port = 0) { + this(); + + setHost(host, port); + } + + public ~this() { + sfHttp_Destroy(http); + } + + public void setHost(string host, ushort port = 0) { + sfHttp_SetHost(http, toStringz(host), port); + } + + public Response sendRequest(const(Request) request, uint timeout = 0) { + return new Response(request, timeout); + } + */ } package extern(C++) { struct sfHttp { private void[httpSize] data = void; } + + struct sfHttpRequest {} + + sfHttpRequest* sfHttpRequest_Create(const char* uri, size_t uriLength, uint method, const char* requestBody, size_t requestBodyLength); + void sfHttpRequest_Destroy(sfHttpRequest* request); + + void sfHttpRequest_SetField(sfHttpRequest* request, const char* field, size_t fieldLength, const char* value, size_t valueLength); + void sfHttpRequest_SetMethod(sfHttpRequest* request, uint method); + void sfHttpRequest_SetUri(sfHttpRequest* request, const char* uri, size_t uriLength); + void sfHttpRequest_SetHttpVersion(sfHttpRequest* request, uint major, uint minor); + void sfHttpRequest_SetBody(sfHttpRequest* request, const char* requestBody, size_t requestBodyLength); + + struct sfHttpResponse {} + + sfHttpResponse* sfHttpResponse_Create(); + void sfHttpResponse_Destroy(sfHttpResponse* response); + + const(char)* sfHttpResponse_GetField(const sfHttpResponse* response, const char* field, size_t fieldLength); + uint sfHttpResponse_GetStatus(const sfHttpResponse* response); + uint sfHttpResponse_GetMajorHttpVersion(const sfHttpResponse* response); + uint sfHttpResponse_GetMinorHttpVersion(const sfHttpResponse* response); + const(char)* sfHttpResponse_GetBody(const sfHttpResponse* response); }