void VertexServer_requestHandler(void *arg) { VertexServer *self = (VertexServer *)arg; VertexServer_setupYajl(self); HttpResponse_setContentType_(self->httpResponse, "application/json;charset=utf-8"); int result = VertexServer_process(self); Datum *content = HttpResponse_content(self->httpResponse); if (result == 0) { if (!Datum_size(content)) { Datum_setCString_(content, "null"); } Datum_nullTerminate(content); } else { if (!Datum_size(content)) { Datum_setCString_(content, "\"unknown error\""); } Datum_nullTerminate(content); yajl_gen_clear(self->yajl); yajl_gen_datum(self->yajl, content); Datum_setYajl_(content, self->yajl); if(self->debug) { Log_Printf_("REQUEST ERROR: %s\n", Datum_data(content)); } } }
void HttpRequest_parseUri_(HttpRequest *self, const char *uri) { Datum_setCString_(self->uri, uri); int index; Datum *uriDatum = Datum_poolNew(); Datum_setCString_(uriDatum, uri); //if (self->debug) { Log_Printf_("request: %s\n", uri); } CHash_clear(self->query); Datum_setSize_(self->uriPath, 0); index = Datum_from_beforeChar_into_(uriDatum, 1, '?', self->uriPath); Datum_decodeUri(self->uriPath); for (;;) { Datum *key = Datum_poolNew(); Datum *value = Datum_poolNew(); index = Datum_from_beforeChar_into_(uriDatum, index + 1, '=', key); Datum_decodeUri(key); Datum_nullTerminate(key); if (Datum_size(key) == 0) break; index = Datum_from_beforeChar_into_(uriDatum, index + 1, '&', value); Datum_decodeUri(value); Datum_nullTerminate(value); CHash_at_put_(self->query, key, value); if(self->requestParameterCallback) { self->requestParameterCallback(self->delegate, key, value); } if (Datum_size(value) == 0) break; } }
int VertexServer_api_queuePopTo(VertexServer *self) { PNode *fromNode = PDB_allocNode(self->pdb); PNode *toNode = PDB_allocNode(self->pdb); Datum *toPath = HttpRequest_queryValue_(self->httpRequest, "toPath"); long ttl = Datum_asLong(HttpRequest_queryValue_(self->httpRequest, "ttl")); if (PNode_moveToPathIfExists_(fromNode, HttpRequest_uriPath(self->httpRequest)) != 0) { VertexServer_setErrorCString_(self, "from path does not exist: "); VertexServer_appendError_(self, HttpRequest_uriPath(self->httpRequest)); return -1; } PNode_moveToPath_(toNode, toPath); //printf("to pid: %s\n", Datum_data(PNode_pid(toNode))); //printf("from pid: %s\n", Datum_data(PNode_pid(fromNode))); { PQuery *q = PNode_query(fromNode); VertexServer_setupPQuery_(self, q); PNode_startQuery(fromNode); Datum *k = PQuery_key(q); Datum *v = PNode_value(fromNode); if (k) { PNode_atPut_(toNode, k, v); PNode_moveToKey_(toNode, k); // insert queue time { long now = time(NULL); Datum *timeKey = Datum_poolNewWithCString_("_qtime"); Datum *timeValue = Datum_poolNew(); Datum_fromLong_(timeValue, now); PNode_atPut_(toNode, timeKey, timeValue); Datum_setCString_(timeKey, "_qexpire"); Datum_fromLong_(timeValue, now + (ttl == 0 ? 3600 : ttl)); PNode_atPut_(toNode, timeKey, timeValue); } //printf("queueing key %s\n", Datum_data(k)); yajl_gen_datum(self->yajl, k); PNode_removeAt_(fromNode, k); } else { yajl_gen_null(self->yajl); } } Datum_appendYajl_(self->result, self->yajl); return 0; }
void PNode_setPidCString_(PNode *self, const char *pid) { Datum_setCString_(self->pid, pid); PNode_setPathsFromPid(self); }
void File_setPathCString_(File *self, const char *path) { Datum_setCString_(self->path, path); }
void Datum_encodeUri(Datum *self) { char *k = evhttp_encode_uri(Datum_data(self)); Datum_setCString_(self, k); free(k); }