7 #include "http-iconv.h"
8 #include "util_string.h"
10 #include <boost/scoped_ptr.hpp>
11 #include <neon/ne_session.h>
12 #include <neon/ne_request.h>
19 class NeonPostBodyProvider {
22 std::vector<std::pair<ustring, ustring> > postFile;
35 std::vector<std::pair<ustring, ustring> >::iterator bp;
36 std::vector<std::pair<ustring, ustring> >::iterator ep;
41 NeonPostBodyProvider (NeonQuery* _query) {
49 virtual ~NeonPostBodyProvider () {};
51 void pushFile (const ustring& name, const ustring& path);
52 void makeSeparator ();
53 ustring separatorLine ();
54 ustring separatorHeader ();
55 ustring textSeparator (const ustring& name);
56 ustring fileSeparator (const ustring& name, const ustring& filename);
57 ustring tailSeparator ();
58 ne_off_t calcLength ();
59 char* bodyProvider (char* buffer, size_t buflen);
61 ssize_t bodyProviderText (char* buffer, size_t buflen);
75 NeonSession (proto_t _proto, const ustring& host, unsigned int port);
76 virtual ~NeonSession ();
78 virtual ne_session& operator * () const {
81 virtual ne_session* operator -> () const {
84 virtual ne_session* get () const {
87 virtual void setNoVerify ();
88 virtual void setProxy (const ustring& host, int port);
100 METHOD_FILE, /* pseudo method */
110 MNodePtr getQueryParam;
112 StoreType rawGetQuery;
113 ustring querytype; /* リクエストヘッダのcontent-type */
116 boost::scoped_ptr<NeonPostBodyProvider> qbody;
117 boost::scoped_ptr<UIConv> cv_in;
118 boost::scoped_ptr<UIConv> cv_out;
125 std::vector<CookieInfo> replyCookie;
126 bool replyCookieDone;
128 NeonQuery (ne_session* _session, MlEnv* _mlenv): rawQuery (_mlenv), rawGetQuery (_mlenv) {
133 replyCookieDone = false;
134 qbody.reset (new NeonPostBodyProvider (this));
136 virtual ~NeonQuery () {
140 virtual void closeReq ();
141 virtual void setIConv (const char* name);
142 virtual void submit ();
143 virtual void readBody (MotorOutput* out);
144 virtual int getStatus ();
145 virtual ustring cv (const ustring& src);
146 virtual ustring rcv (const ustring& src);
147 virtual ustring getResponseHeader (const char* name);
148 virtual MNode* getResponseHeaderAll ();
149 virtual ustring getResponseCookie (const ustring& name);
150 virtual MNode* getResponseCookieAll ();
152 virtual const char* methodStr ();
153 virtual ustring buildGetQuery ();
154 virtual void buildQuery (MNode* e, ustring& out);
155 virtual ustring buildMimeSeparator_text (const ustring& name);
156 virtual ustring buildMimeSeparator_file (const ustring& name, const ustring& filename);
157 virtual ustring filterPath ();
158 virtual void buildCookie ();
159 virtual void buildHeader ();
160 virtual void buildBasicAuthHeader ();
161 virtual void setFormType ();
162 virtual void setFormType_urlencoded ();
163 virtual void setFormType_formdata ();
164 virtual void parseCookie ();
165 virtual void setRawQuery (FileMacro& fd);
168 class MLNeon: public MLFunc {
172 NeonSession::proto_t proto;
178 boost::scoped_ptr<NeonSession> session;
179 boost::scoped_ptr<NeonQuery> query;
181 MLNeon (MlEnv* _mlenv): MLFunc (cMLNeonID, _mlenv) {
182 proto = NeonSession::PROTO_HTTP;
186 virtual ~MLNeon () {};
188 virtual void newSession (MlEnv* mlenv);
191 inline void assignNLNeon (MLNeon*& var, MNode* e) {
192 if (e && e->type == MNode::MC_LIBOBJ && e->libobj && e->libobj->id == cMLNeonID)
193 var = (MLNeon*)e->libobj;
196 MNode* ml_neon (MNode* cell, MlEnv* mlenv);
197 MNode* ml_neon_http_request (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
198 MNode* ml_neon_http_status (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
199 MNode* ml_neon_http_response (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
200 MNode* ml_neon_http_response_file (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
201 MNode* ml_neon_http_response_output (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
202 MNode* ml_neon_http_get_cookie (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
203 MNode* ml_neon_http_get_all_cookies (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
204 MNode* ml_neon_http_content_type (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
205 MNode* ml_neon_http_get_header (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
206 MNode* ml_neon_http_get_all_headers (MNode* cell, MlEnv* mlenv, MLFunc* mobj);
208 #endif /* ML_NEON_H */