/* * send response to server */ static void sendResponse(HTTPResponse *resp) { String *resphdrs; #ifndef PROFILE FCGX_FPrintF(out,"Status: %d %s" CRLF,resp->status,resp->statusMsg); #endif resphdrs = resp_packageHeaders(resp); #ifndef PROFILE FCGX_PutS(resphdrs->text,out); #endif str_free(resphdrs); #ifndef PROFILE FCGX_PutS(CRLF, out); #endif #ifndef PROFILE /* resp->content_valid will be 0 for HEAD requests and empty responses */ if (resp->content_valid) { while (resp->content_read < resp->content_length) { //fwrite(resp->content,sizeof(char),resp->content_valid,stdout); FCGX_PutStr(resp->content, resp->content_valid, out); if (resp_getResponseContent(resp, 1) == -1) { break; } } //fwrite(resp->content,sizeof(char),resp->content_valid,stdout); FCGX_PutStr(resp->content, resp->content_valid, out); } FCGX_FFlush(out); #endif return; }
static int request_write_header_(void *data, const char *name, const char *value, int more) { CONTAINER_REQUEST *me = (CONTAINER_REQUEST *) data; FCGX_PutS(name, me->out); FCGX_PutChar(':', me->out); FCGX_PutChar(' ', me->out); FCGX_PutS(value, me->out); FCGX_PutChar('\n', me->out); me->wbytes += strlen(name) + strlen(value) + 3; return 0; }
int FCGI_fputs(const char *str, FCGI_FILE *fp) { if(fp->stdio_stream) return fputs(str, fp->stdio_stream); else if(fp->fcgx_stream) return FCGX_PutS(str, fp->fcgx_stream); return EOF; }
int main(void) { FCGX_Init(); int socket = FCGX_OpenSocket(SOCKET_PATH, 0); char* remote_addr; FCGX_Request request; if (FCGX_InitRequest(&request, socket, 0) != 0) return 1; while (1) { FCGX_Accept_r(&request); remote_addr = FCGX_GetParam("REMOTE_ADDR", request.envp); FCGX_PutS("Content-type: text/plain\n\n", request.out); FCGX_PutS(remote_addr, request.out); FCGX_PutS("\n", request.out); FCGX_Finish_r(&request); } }
int lsp::lua_log(lua_State *L) { const char* s=luaL_checkstring(L,1); log(LOG_INFO, "%s", s); FCGX_Request* r = (FCGX_Request*)luaL_lsp_get_io_ctx(L); if (r) { FCGX_PutS(s, r->err); } return 0; }
static inline void output_headers(lsp::REQBAG* bag) { if (bag->header_out) return; std::map<std::string, std::string>::iterator ptr = bag->out_header.begin(); std::stringstream ss; for (; ptr != bag->out_header.end(); ++ptr) { ss << ptr->first << ": "; ss << ptr->second << std::endl; } FCGX_PutS(ss.str().c_str(), bag->out); bag->header_out = true; }
int FCGX_PutSm_internal(FCGX_Stream * stream, ...) { int r = 0; va_list a; const char *s; va_start(a, stream); while ((s = va_arg(a, const char *))) if (FCGX_PutS(s, stream) == -1) { r = -1; break; } va_end(a); return r; }
int bridge_request_getinput(bridge_request_t *self, char **data) { char *contentLength; char *buffer; int len = 0; if ((contentLength = FCGX_GetParam("CONTENT_LENGTH", self->request.envp)) != 0) len = strtol(contentLength, NULL, 10); if (len <= 0) return EINVAL; if ((buffer = malloc((size_t)len+1)) == 0) { FCGX_PutS("out of memory!", self->request.err); return ENOMEM; } if (FCGX_GetStr(buffer, len, self->request.in) != len) { FCGX_PutS("Got less data than expected.", self->request.err); return EINVAL; } buffer[len] = '\0'; *data = buffer; return 0; }
static void flush_headers(slash_context_t* ctx) { sl_response_key_value_t* headers; size_t header_count, i; int sent_content_type = 0; if(ctx->sent_headers) { return; } ctx->sent_headers = 1; headers = sl_response_get_headers(ctx->vm, &header_count); FCGX_FPrintF(ctx->request.out, "Status: %d\r\n", sl_response_get_status(ctx->vm)); for(i = 0; i < header_count; i++) { /* @TODO: do something not non-standard */ if(strcasecmp(headers[i].name, "Content-Type") == 0) { sent_content_type = 1; } FCGX_FPrintF(ctx->request.out, "%s: %s\r\n", headers[i].name, headers[i].value); } if(!sent_content_type) { FCGX_PutS("Content-Type: text/html; charset=utf-8\r\n", ctx->request.out); } FCGX_PutS("\r\n", ctx->request.out); }
bool GetAllRequest::response() { if (!Request::response() && false) return false; Statement sql; sql << "SELECT id, type, name, budget, click_price, click_count FROM ad_union_ads"; stringstream ss; try { mysqlpp::StoreQueryResult res = QueryRunner("ad_db", CDbRServer).store(sql); if (!res) { FCGX_FPrintF(_fcgi_out, "Content-type: text/html\r\n\r\n-3"); return false; } ss << "Content-type: text/html\r\n\r\n["; for (size_t i = 0; i<res.num_rows(); ++i) { mysqlpp::Row row = res.at(i); if (i) { ss << ","; } string name = row["name"].c_str(); jsonEscape(name); int click_count = (int)row["click_count"]; int click_price = (int)row["click_price"]; int budget = (int)row["budget"]; ss << "{'id':'" << (long)row["id"] << "','type':" << (long)row["type"] << ", 'name':'" << name << "', 'remaining':" << budget - click_count * click_price << "}"; } ss << "]"; } catch (std::exception& e) { MCE_WARN("db err : " << e.what()); FCGX_FPrintF(_fcgi_out, "Content-type: text/html\r\n\r\n-1"); return false; } catch (...) { MCE_WARN("db unkown exception."); FCGX_FPrintF(_fcgi_out, "Content-type: text/html\r\n\r\n-2"); return false; } MCE_DEBUG("response : " << ss.str()); FCGX_PutS(ss.str().c_str(), _fcgi_out); return true; }
int FCGI_puts(const char *str) { int n; if(FCGI_stdout->stdio_stream) { n = fputs(str, FCGI_stdout->stdio_stream); if(n < 0) return n; else return fputc('\n', FCGI_stdout->stdio_stream); } else if(FCGI_stdout->fcgx_stream) { n = FCGX_PutS(str, FCGI_stdout->fcgx_stream); if(n < 0) return n; else return FCGX_PutChar('\n', FCGI_stdout->fcgx_stream); } return EOF; }
JSBool Output_flush (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { JS_BeginRequest(cx); JS_EnterLocalRootScope(cx); jsval property; JS_GetProperty(cx, obj, "content", &property); FCGX_PutS(JS_GetStringBytes(JS_ValueToString(cx, property)), ((LCGIData*) JS_GetContextPrivate(cx))->cgi->out); property = JS_GetEmptyStringValue(cx); JS_SetProperty(cx, obj, "content", &property); JS_LeaveLocalRootScope(cx); JS_EndRequest(cx); return JS_TRUE; }
int lsp::io_def_puts(void* ctx,const char* s) { REQBAG *bag = (REQBAG*)ctx; output_headers(bag); return FCGX_PutS(s, bag->out); }
Request& Request::operator<<(const char* const out) { FCGX_PutS(out, request.out); return *this; }
void bridge_request_fatal(bridge_request_t *self) { FCGX_PutS("Status: 400 Bad Request\r\n\r\n", self->request.out); FCGX_PutS("Status: 400 Bad Request\n", self->request.err); }
void bridge_request_transmit(bridge_request_t *self, struct json_object *obj) { FCGX_PutS("Content-type: application/json\r\n\r\n", self->request.out); FCGX_PutS(json_object_to_json_string(obj), self->request.out); }
int lsp::luabag_run(LUABAG* luabag, FCGX_Request* r) { int handler_type = handler_type_unknown; char* handler = FCGX_GetParam("SCRIPT_NAME", r->envp); if(handler) { handler=strrchr(handler,'.'); if(!handler) { log(LOG_ERR, "%s", "Script name has no extension name"); return -1; } if(!strcmp(handler,".lsp") || !strcmp(handler,".lp") ) handler_type = handler_type_lsp; else if(!strcmp(handler,".lua")) { handler_type = handler_type_lua; log(LOG_ERR, "%s", "lua handler"); } else { log(LOG_ERR, "%s:%s", "Not correct extension name, valid extension are lp, lsp, lua", handler); return -1; } } else { log(LOG_ERR, "%s", "Not script name"); return -1; } lsp_io lio={r, lputs:io_def_puts, lputc:io_def_putc, lwrite:io_def_write}; luaL_lsp_set_io(luabag->L,&lio); char* p = FCGX_GetParam("REQUEST_METHOD", r->envp); if(p && !strcmp(p,"POST")) { int rc = read_request_data(luabag->L); if(rc!= 0) return rc; } p = FCGX_GetParam("QUERY_STRING", r->envp); luaL_lsp_setargs(luabag->L, p, p ? strlen(p) : 0); lua_getfield(luabag->L,LUA_GLOBALSINDEX,"env"); //luaL_lsp_setfield(luabag->L,"server_admin",r->server->server_admin); luaL_lsp_setfield(luabag->L,"server_hostname", FCGX_GetParam("SERVER_NAME", r->envp)); luaL_lsp_setfield(luabag->L,"remote_ip",FCGX_GetParam("REMOTE_ADDR", r->envp)); luaL_lsp_setfield(luabag->L,"remote_host",FCGX_GetParam("REMOTE_ADDR", r->envp)); luaL_lsp_setfield(luabag->L,"remote_port",FCGX_GetParam("REMOTE_PORT", r->envp)); luaL_lsp_setfield(luabag->L,"local_ip", FCGX_GetParam("SERVER_ADDR", r->envp)); luaL_lsp_setfield(luabag->L,"local_host",FCGX_GetParam("SERVER_NAME", r->envp)); luaL_lsp_setfield(luabag->L,"local_port",FCGX_GetParam("SERVER_PORT", r->envp)); char hostname[256]; if (0 == gethostname(hostname, 256)) { luaL_lsp_setfield(luabag->L,"local_host", hostname); luaL_lsp_setfield(luabag->L,"hostname", hostname); } luaL_lsp_setfield(luabag->L,"method", FCGX_GetParam("REQUEST_METHOD", r->envp)); luaL_lsp_setfield(luabag->L,"handler", handler); luaL_lsp_setfield(luabag->L,"uri", FCGX_GetParam("REQUEST_URI", r->envp)); luaL_lsp_setfield(luabag->L,"doc_uri", FCGX_GetParam("DOCUMENT_URI", r->envp)); luaL_lsp_setfield(luabag->L,"doc_root", FCGX_GetParam("DOCUMENT_ROOT", r->envp)); char* filename = FCGX_GetParam("SCRIPT_FILENAME", r->envp); luaL_lsp_setfield(luabag->L,"filename", filename); luaL_lsp_setfield(luabag->L,"accept_lang", FCGX_GetParam("HTTP_ACCEPT_LANGUAGE", r->envp)); lua_pop(luabag->L,1); luaL_lsp_chdir_to_file(luabag->L, filename); luaL_lsp_session_init(luabag->L, !g_conf->cookie_name.empty() ? g_conf->cookie_name.c_str() : "LSPSESSID", g_conf->cookie_days > 0 ? g_conf->cookie_days : 7, !g_conf->cookie_path.empty() ? g_conf->cookie_path.c_str() : "/"); int status=0; switch(handler_type) { case handler_type_lsp: status=luaL_load_lsp_file(luabag->L, filename); header_table_set(r, "CONTENT-TYPE", "text/html"); break; case handler_type_lua: status=luaL_loadfile(luabag->L, filename); header_table_set(r, "CONTENT-TYPE", "text/plain"); break; } if(status) { const char* e=lua_tostring(luabag->L,-1); FCGX_PutS(e, r->err); log(LOG_ERR, "%s", e); lua_pop(luabag->L,1); luaL_lsp_chdir_restore(luabag->L); return 500; } status=lua_pcall(luabag->L,0,LUA_MULTRET,0); // won't return other than 0, as the code has been excuted with outputs if(status) { const char* e=lua_tostring(luabag->L,-1); log(LOG_ERR, "%s", e); FCGX_PutS(e, r->err); if(g_conf->show_exception) // if not 0 FCGX_PutS(e, r->err); lua_pop(luabag->L,1); } int rnum=lua_gettop(luabag->L); int result = 0; if(rnum>0) { result = lua_tointeger(luabag->L,-1); if(!result || result==200) result = 0; lua_pop(luabag->L,rnum); } luaL_lsp_chdir_restore(luabag->L); /* if(result == 0) FCGX_FFlush(r->out); else FCGX_FFlush(r->err); */ return result; }
bool GetOneRequest::response() { if (!Request::response() && false) return false; long aid = getPropertyLong("id"); Statement sql; sql << "SELECT id, type, name, owner_id, group_id, campaign_id, budget, daily_budget, "\ "click_price, click_count, title, content, img_url, dest_url, update_time FROM ad_union_ads WHERE id=" << aid; stringstream ss; try { mysqlpp::StoreQueryResult res = QueryRunner("ad_db", CDbRServer).store(sql); if (!res) { FCGX_FPrintF(_fcgi_out, "Content-type: text/html\r\n\r\n-3"); return false; } ss << "Content-type: text/html\r\n\r\n["; for (size_t i = 0; i<res.num_rows(); ++i) { mysqlpp::Row row = res.at(i); if (i) { ss << ","; } string name = row["name"].c_str(); jsonEscape(name); int click_count = (int)row["click_count"]; int click_price = (int)row["click_price"]; int budget = (int)row["budget"]; string title = row["title"].c_str(); jsonEscape(title); string content = row["content"].c_str(); jsonEscape(content); for(size_t i = 0; i < content.size(); ++i) { if (content[i] == '\r' || content[i] == '\n') { content[i] = ' '; } } ss << "{'id':'" << (long)row["id"] << '\'' << ",'type':" << (long)row["type"] << ", 'name':'" << name << '\'' << ", 'owner_id':'" << row["owner_id"] << '\'' << ", 'group_id':'" << row["group_id"] << '\'' << ", 'campaign_id':'" << row["campaign_id"] << '\'' << ", 'budget':'" << budget << '\'' << ", 'click_price':'" << click_price << '\'' << ", 'click_count':'" << click_count << '\'' << ", 'daily_budget':'" << row["daily_budget"] << '\'' << ", 'title':'" << title << '\'' << ", 'content':'" << content << '\'' << ", 'img_url':'" << row["img_url"] << '\'' << ", 'dest_url':'" << row["dest_url"] << '\'' << ", 'update_time':'" << row["update_time"] << '\'' << "}"; } ss << "]"; } catch (std::exception& e) { MCE_WARN("db err : " << e.what()); FCGX_FPrintF(_fcgi_out, "Content-type: text/html\r\n\r\n-1"); return false; } catch (...) { MCE_WARN("db unkown exception."); FCGX_FPrintF(_fcgi_out, "Content-type: text/html\r\n\r\n-2"); return false; } MCE_DEBUG("response : " << ss.str()); FCGX_PutS(ss.str().c_str(), _fcgi_out); return true; }