注册功能
#include"fcgio.h"
#include"fcgi_config.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <sys/time.h>
#include <memory>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/error/en.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
enum ResponseCode
{
Succ = 0,
Error = 1,
UserError=10,
UserExists=11,
UserNotLogin,
UserInvalid,
FileError=20,
FileExists,
FileNotExists
};
using namespace std;
using namespace rapidjson;
#define LOG_MODULE "cgi"
#define LOG_PROC "register"
class ConfigHelper
{
public:
static ConfigHelper &getInstance(){return smInstance;}
std::string getVal(std::string field,std::string key)
{
return this->mCfgRootMap[field][key];
}
private:
ConfigHelper()
{
}
ConfigHelper(const ConfigHelper&);
static ConfigHelper smInstance;
std::map<std::string,std::map<std::string,std::string>> mCfgRootMap;
};
ConfigHelper ConfigHelper::smInstance;
class FastCGIApplication
{
public:
FastCGIApplication()
{
}
virtual ~FastCGIApplication()
{
}
virtual void Get(map<string,string> headers)
{
cout<<"Status: 405 Method Not Allowed\r\n";
}
virtual void Post(map<string,string> headers,char *data,size_t len)
{
cout<<"Status: 405 Method Not Allowed\r\n";
}
virtual int run()
{
std::cout<<"this fastcgi program staring"<<std::endl;
streambuf * cin_streambuf = cin.rdbuf();
streambuf * cout_streambuf = cout.rdbuf();
streambuf * cerr_streambuf = cerr.rdbuf();
FCGX_Request request;
FCGX_Init();
FCGX_InitRequest(&request, 0, 0);
while (FCGX_Accept_r(&request) == 0)
{
fcgi_streambuf cin_fcgi_streambuf(request.in);
fcgi_streambuf cout_fcgi_streambuf(request.out);
fcgi_streambuf cerr_fcgi_streambuf(request.err);
#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
cin = &cin_fcgi_streambuf;
cout = &cout_fcgi_streambuf;
cerr = &cerr_fcgi_streambuf;
#else
cin.rdbuf(&cin_fcgi_streambuf);
cout.rdbuf(&cout_fcgi_streambuf);
cerr.rdbuf(&cerr_fcgi_streambuf);
#endif
map<string,string> headers;
for(auto envStr = request.envp ; *envStr!=nullptr;++envStr)
{
string s = *envStr;
auto pos = s.find('=');
string key = s.substr(0,pos);
string value = s.substr(pos+1);
headers.insert(make_pair(key,value));
}
auto itContentLength = headers.find("CONTENT_LENGTH");
size_t contentLength = 0;
if(itContentLength!=headers.end())
{
auto strContentLenght = itContentLength->second;
contentLength = strContentLenght.empty()?0:stoll(strContentLenght);
}
unique_ptr<char[]> uptr;
if(contentLength!=0)
{
char *data=new char[contentLength];
uptr.reset(data);
size_t read_sum=0;
for(;!cin.eof()&&read_sum<contentLength;)
{
char buf[1024];
size_t readLen=0;
memset(buf,0,sizeof(buf));
cin.read(buf,sizeof(buf));
readLen = cin.gcount();
memcpy(data+read_sum,buf,readLen);
read_sum+=readLen;
}
if(read_sum!=contentLength)
{
continue;
}
}
auto requestMethod = headers["REQUEST_METHOD"];
if(requestMethod=="GET")
{
this->Get(headers);
}
else if(requestMethod=="POST")
{
this->Post(headers,uptr.get(),contentLength);
}
else
{
cout<<"Status: 405 Method Not Allowed\r\n";
}
}
#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
cin = cin_streambuf;
cout = cout_streambuf;
cerr = cerr_streambuf;
#else
cin.rdbuf(cin_streambuf);
cout.rdbuf(cout_streambuf);
cerr.rdbuf(cerr_streambuf);
#endif
return 0;
}
};
class RegisterCGIApplication:public FastCGIApplication
{
public:
struct RegisterInfo
{
string userName;
string nickName;
string phone;
string passwd;
string email;
};
RegisterInfo getRegisterInfo(string json)
{
Document d;
if(d.Parse(json.c_str()).HasParseError())
{
throw runtime_error(
string("parse json "+ json +" error :") +
GetParseError_En(d.GetParseError()));
}
return {
d["userName"].GetString(),
d["nickName"].GetString(),
d["phone"].GetString(),
d["passwd"].GetString(),
d["email"].GetString()
};
}
void Post(map<string,string>,char *data,size_t len)
{
int resultCode=Succ;
unique_ptr<sql::Connection> con(nullptr);
try{
do
{
string content(data,data+len);
auto regInfo = this->getRegisterInfo(content);
sql::Driver *driver;
driver = ::get_driver_instance();
string mysqlHost = "159.75.127.51";
string mysqlPort="3306";
string mysqlDBName= "edison";
string mysqlUser="root";
string mysqlPasswd= "lwx856839";
con.reset(driver->connect("tcp://"+mysqlHost+":"+mysqlPort,mysqlUser,mysqlPasswd));
con->setSchema(mysqlDBName);
con->setAutoCommit(false);
unique_ptr<sql::PreparedStatement> prepStat(con->prepareStatement("select * from userinfo where name = ?"));
prepStat->setString(1,regInfo.userName);
unique_ptr<sql::ResultSet> res(prepStat->executeQuery());
if(res->next())
{
std::cout<<"have data coming"<<std::endl;
resultCode=UserExists;
break;
}
prepStat.reset(con->prepareStatement("insert into userinfo(name,nickname,password,phone,createtime,email) values(?,?,?,?,now(),?)"));
prepStat->setString(1,regInfo.userName);
prepStat->setString(2,regInfo.nickName);
prepStat->setString(3,regInfo.passwd);
prepStat->setString(4,regInfo.phone);
prepStat->setString(5,regInfo.email);
if(prepStat->executeUpdate()!=1)
{
resultCode=Error;
break;
}
con->commit();
}while(0);
}
catch(const exception &e)
{
resultCode=Error;
if(con.get()!=nullptr)
{
con->rollback();
}
}
StringBuffer sb;
Writer<StringBuffer> writer(sb);
writer.StartObject();
writer.Key("code");
writer.Int(resultCode);
writer.EndObject();
cout << "Content-type: application/json\r\n\r\n";
cout<<sb.GetString();
}
};
int main()
{
RegisterCGIApplication app;
return app.run();
}
登入功能
#include <map>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include<iostream>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/error/en.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
#include "fcgio.h"
#include "fcgi_config.h"
#include <memory>
#include <string>
#include <map>
#include <cstring>
using namespace std;
using namespace rapidjson;
#define LOG_MODULE "cgi"
#define LOG_PROC "login"
enum ResponseCode
{
Succ = 0,
Error = 1,
UserError=10,
UserExists=11,
UserNotLogin,
UserInvalid,
FileError=20,
FileExists,
FileNotExists
};
typedef struct LoginInfo
{
string userName;
string passwd;
string nickName;
string phone;
string email;
long long id;
}LoginInfo;
class FastCGIApplication
{
public:
FastCGIApplication()
{
}
virtual ~FastCGIApplication()
{
}
virtual void Get(map<string,string> headers)
{
cout<<"Status: 405 Method Not Allowed\r\n";
}
virtual void Post(map<string,string> headers,char *data,size_t len)
{
cout<<"Status: 405 Method Not Allowed\r\n";
}
virtual int run()
{
streambuf * cin_streambuf = cin.rdbuf();
streambuf * cout_streambuf = cout.rdbuf();
streambuf * cerr_streambuf = cerr.rdbuf();
FCGX_Request request;
FCGX_Init();
FCGX_InitRequest(&request, 0, 0);
while (FCGX_Accept_r(&request) == 0)
{
fcgi_streambuf cin_fcgi_streambuf(request.in);
fcgi_streambuf cout_fcgi_streambuf(request.out);
fcgi_streambuf cerr_fcgi_streambuf(request.err);
#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
cin = &cin_fcgi_streambuf;
cout = &cout_fcgi_streambuf;
cerr = &cerr_fcgi_streambuf;
#else
cin.rdbuf(&cin_fcgi_streambuf);
cout.rdbuf(&cout_fcgi_streambuf);
cerr.rdbuf(&cerr_fcgi_streambuf);
#endif
map<string,string> headers;
for(auto envStr = request.envp ; *envStr!=nullptr;++envStr)
{
string s = *envStr;
auto pos = s.find('=');
string key = s.substr(0,pos);
string value = s.substr(pos+1);
headers.insert(make_pair(key,value));
}
auto itContentLength = headers.find("CONTENT_LENGTH");
size_t contentLength = 0;
if(itContentLength!=headers.end())
{
auto strContentLenght = itContentLength->second;
contentLength = strContentLenght.empty()?0:stoll(strContentLenght);
}
unique_ptr<char[]> uptr;
if(contentLength!=0)
{
char *data=new char[contentLength];
uptr.reset(data);
size_t read_sum=0;
for(;!cin.eof()&&read_sum<contentLength;)
{
char buf[1024];
size_t readLen=0;
memset(buf,0,sizeof(buf));
cin.read(buf,sizeof(buf));
readLen = cin.gcount();
memcpy(data+read_sum,buf,readLen);
read_sum+=readLen;
}
if(read_sum!=contentLength)
{
continue;
}
}
auto requestMethod = headers["REQUEST_METHOD"];
if(requestMethod=="GET")
{
this->Get(headers);
}
else if(requestMethod=="POST")
{
this->Post(headers,uptr.get(),contentLength);
}
else
{
cout<<"Status: 405 Method Not Allowed\r\n";
}
}
#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
cin = cin_streambuf;
cout = cout_streambuf;
cerr = cerr_streambuf;
#else
cin.rdbuf(cin_streambuf);
cout.rdbuf(cout_streambuf);
cerr.rdbuf(cerr_streambuf);
#endif
return 0;
}
};
class LoginCGIApplication:public FastCGIApplication
{
public:
LoginCGIApplication()
{
}
LoginInfo ParseRequestJson(const string json)
{
Document d;
if(d.Parse(json.c_str()).HasParseError())
{
throw runtime_error(
string("parse json "+ json +" error :") +
GetParseError_En(d.GetParseError()));
}
return {
d["userName"].GetString(),
d["passwd"].GetString()
};
}
bool ValidateUser(LoginInfo &info)
{
unique_ptr<sql::Connection> con(nullptr);
bool result = false;
try
{
sql::Driver *driver;
driver = ::get_driver_instance();
string mysqlHost ="159.75.127.51";
string mysqlPort="3306";
string mysqlDBName="edison";
string mysqlUser="root";
string mysqlPasswd="lwx856839";
con.reset(driver->connect("tcp://"+mysqlHost+":"+mysqlPort,mysqlUser,mysqlPasswd));
con->setSchema(mysqlDBName);
unique_ptr<sql::PreparedStatement> prepStat(con->prepareStatement("select id,nickname,phone,email from userinfo where name = ? and password = ?"));
prepStat->setString(1,info.userName);
prepStat->setString(2,info.passwd);
unique_ptr<sql::ResultSet> res(prepStat->executeQuery());
if(res->next())
{
info.id=res->getUInt("id");
info.phone = res->getString("phone");
info.nickName = res->getString("nickname");
info.email = res->getString("email");
result = true;
}
}
catch(const sql::SQLException &e)
{
}
catch(const exception &e)
{
}
catch(...)
{
}
return result;
}
void Post(map<string,string>,char *data ,size_t len)
{
int resultCode = Succ;
string token;
try
{
do
{
string content(data,data+len);
auto info = this->ParseRequestJson(content);
if(!this->ValidateUser(info))
{
resultCode = UserInvalid;
break;
}
}while(0);
}
catch(const exception &e)
{
resultCode=Error;
}
StringBuffer sb;
Writer<StringBuffer> writer(sb);
writer.StartObject();
writer.Key("code");
writer.Int(resultCode);
writer.Key("token");
writer.String(token.c_str(),static_cast<rapidjson::SizeType>(token.length()));
writer.EndObject();
cout << "Content-type: application/json\r\n\r\n";
cout<<sb.GetString()<<endl;
}
};
int main()
{
LoginCGIApplication app;
return app.run();
}