Skip to content

Commit

Permalink
Http
Browse files Browse the repository at this point in the history
  • Loading branch information
deadalnix committed Jan 26, 2012
1 parent 4a5162c commit 46d8809
Show file tree
Hide file tree
Showing 2 changed files with 161 additions and 57 deletions.
58 changes: 58 additions & 0 deletions src/dsfml/network/Http.cpp
Expand Up @@ -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<sf::Http::Request::Method, unsigned int>(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<sf::Http::Request::Method, unsigned int>(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();
}

160 changes: 103 additions & 57 deletions src/dsfml/network/http.d
Expand Up @@ -13,112 +13,158 @@ 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;

@property
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);
}

0 comments on commit 46d8809

Please sign in to comment.