|
@@ -4,63 +4,40 @@
|
|
|
#include "../../std/async/native/async.h"
|
|
|
|
|
|
struct bbHttpRequest::Rep{
|
|
|
- NSMutableURLRequest *_req;
|
|
|
- NSString *_response;
|
|
|
- int _status;
|
|
|
-};
|
|
|
-
|
|
|
-namespace{
|
|
|
-
|
|
|
- struct ReadyStateChangedEvent : public bbAsync::Event{
|
|
|
|
|
|
- bbHttpRequest *req;
|
|
|
- int state;
|
|
|
+ NSMutableURLRequest *_req=0;
|
|
|
|
|
|
- ReadyStateChangedEvent( bbHttpRequest *req ):req( req ),state( req->readyState ){
|
|
|
- }
|
|
|
-
|
|
|
- void dispatch(){
|
|
|
-
|
|
|
- if( state==req->readyState ){
|
|
|
-
|
|
|
- if( req->readyState==4 ){
|
|
|
- req->response=bbString( req->_rep->_response );
|
|
|
- req->status=req->_rep->_status;
|
|
|
- }
|
|
|
-
|
|
|
- req->readyStateChanged();
|
|
|
- }
|
|
|
-
|
|
|
- bbGC::release( req );
|
|
|
-
|
|
|
- delete this;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
-}
|
|
|
+ NSURLSessionDataTask *_dataTask=0;
|
|
|
+};
|
|
|
|
|
|
bbHttpRequest::bbHttpRequest(){
|
|
|
|
|
|
_rep=new Rep;
|
|
|
}
|
|
|
|
|
|
+bbHttpRequest::~bbHttpRequest(){
|
|
|
+
|
|
|
+#if !__has_feature(objc_arc)
|
|
|
+ if( _rep->_req ) [_rep->_req release];
|
|
|
+#endif
|
|
|
+
|
|
|
+ delete _rep;
|
|
|
+}
|
|
|
|
|
|
void bbHttpRequest::open( bbString req,bbString url ){
|
|
|
|
|
|
if( readyState!=0 ) return;
|
|
|
|
|
|
- NSMutableURLRequest *nsreq=[[NSMutableURLRequest alloc] init];
|
|
|
+ _rep->_req=[[NSMutableURLRequest alloc] init];
|
|
|
|
|
|
- [nsreq setHTTPMethod:req.ToNSString()];
|
|
|
+ [_rep->_req setHTTPMethod:req.ToNSString()];
|
|
|
|
|
|
- [nsreq setURL:[NSURL URLWithString:url.ToNSString()]];
|
|
|
+ [_rep->_req setURL:[NSURL URLWithString:url.ToNSString()]];
|
|
|
|
|
|
- if( [nsreq respondsToSelector:@selector(setAllowsCellularAccess:)] ){
|
|
|
- [nsreq setAllowsCellularAccess:YES];
|
|
|
+ if( [_rep->_req respondsToSelector:@selector(setAllowsCellularAccess:)] ){
|
|
|
+ [_rep->_req setAllowsCellularAccess:YES];
|
|
|
}
|
|
|
|
|
|
- _rep->_req=nsreq;
|
|
|
-
|
|
|
setReadyState( 1 );
|
|
|
}
|
|
|
|
|
@@ -70,39 +47,53 @@ void bbHttpRequest::setHeader( bbString name,bbString value ){
|
|
|
|
|
|
[_rep->_req setValue:value.ToNSString() forHTTPHeaderField:name.ToNSString()];
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
void bbHttpRequest::send( bbString text,float timeout ){
|
|
|
|
|
|
if( readyState!=1 ) return;
|
|
|
+
|
|
|
+ NSURLSession *session=[NSURLSession sharedSession];
|
|
|
|
|
|
- bbGC::retain( this );
|
|
|
+ _rep->_dataTask=[session dataTaskWithRequest:_rep->_req completionHandler:
|
|
|
|
|
|
- std::thread( [=](){
|
|
|
-
|
|
|
- _rep->_req.timeoutInterval=(NSTimeInterval)timeout;
|
|
|
-
|
|
|
- NSURLResponse *response=0;
|
|
|
-
|
|
|
- NSData *data=[NSURLConnection sendSynchronousRequest:_rep->_req returningResponse:&response error:0];
|
|
|
+ ^( NSData *data,NSURLResponse *response,NSError *error ){
|
|
|
+
|
|
|
+ if( !error ){
|
|
|
+
|
|
|
+ NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
|
|
|
|
|
- if( data && response ){
|
|
|
+ this->response=bbString( str );
|
|
|
|
|
|
- _rep->_response=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
|
|
+#if !__has_feature(objc_arc)
|
|
|
+ [str release];
|
|
|
+#endif
|
|
|
+
|
|
|
+ status=[(NSHTTPURLResponse*)response statusCode];
|
|
|
+
|
|
|
+ setReadyState( 4 );
|
|
|
+
|
|
|
+ }else{
|
|
|
|
|
|
- _rep->_status=[(NSHTTPURLResponse*)response statusCode];
|
|
|
+ setReadyState( 5 );
|
|
|
}
|
|
|
-
|
|
|
- readyState=4;
|
|
|
-
|
|
|
- ReadyStateChangedEvent *ev=new ReadyStateChangedEvent( this );
|
|
|
|
|
|
- ev->post();
|
|
|
-
|
|
|
- } ).detach();
|
|
|
+ bbGC::release( this );
|
|
|
+ }
|
|
|
+
|
|
|
+ ];
|
|
|
+
|
|
|
+ [_rep->_dataTask resume];
|
|
|
|
|
|
+ bbGC::retain( this );
|
|
|
+
|
|
|
setReadyState( 3 );
|
|
|
}
|
|
|
|
|
|
+void bbHttpRequest::cancel(){
|
|
|
+
|
|
|
+ if( _rep->_dataTask ) [_rep->_dataTask cancel];
|
|
|
+}
|
|
|
+
|
|
|
void bbHttpRequest::setReadyState( int state ){
|
|
|
|
|
|
readyState=state;
|