123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- #include "httprequest.h"
- #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;
- ReadyStateChangedEvent( bbHttpRequest *req,int state ):req( req ),state( state ){
- }
-
- 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;
- }
- };
- }
- bbHttpRequest::bbHttpRequest(){
- _rep=new Rep;
- }
- bbHttpRequest::bbHttpRequest( bbString req,bbString url,bbFunction<void()> readyStateChanged ):bbHttpRequest(){
- this->readyStateChanged=readyStateChanged;
- open( req,url );
- }
-
- bbReadyState bbHttpRequest::readyState(){
-
- return (bbReadyState)_readyState;
- }
-
- bbString bbHttpRequest::responseText(){
- return _response;
- }
-
- int bbHttpRequest::status(){
-
- return _status;
- }
-
- void bbHttpRequest::open( bbString req,bbString url ){
-
- if( _readyState!=0 ) return;
-
- NSMutableURLRequest *nsreq=[[NSMutableURLRequest alloc] init];
-
- [nsreq setHTTPMethod:req.ToNSString()];
-
- [nsreq setURL:[NSURL URLWithString:url.ToNSString()]];
-
- if( [nsreq respondsToSelector:@selector(setAllowsCellularAccess:)] ){
- [nsreq setAllowsCellularAccess:YES];
- }
-
- _rep->_req=nsreq;
-
- _readyState=1;
- }
-
- void bbHttpRequest::setHeader( bbString name,bbString value ){
-
- if( _readyState!=1 ) return;
-
- [_rep->_req setValue:value.ToNSString() forHTTPHeaderField:name.ToNSString()];
- }
-
- void bbHttpRequest::send(){
-
- send( "" );
- }
-
- void bbHttpRequest::send( bbString text ){
-
- if( _readyState!=1 ) return;
-
- bbGC::retain( this );
- _readyState=3; //loading
-
- std::thread( [=](){
- NSURLResponse *response=0;
-
- NSData *data=[NSURLConnection sendSynchronousRequest:_rep->_req returningResponse:&response error:0];
-
- if( data && response ){
-
- _rep->_response=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-
- _rep->_status=[(NSHTTPURLResponse*)response statusCode];
-
- //_recv=[data length];
- }
-
- _readyState=4; //loaded
-
- ReadyStateChangedEvent *ev=new ReadyStateChangedEvent( this,_readyState );
-
- ev->post();
-
- } ).detach();
- }
- void bbHttpRequest::gcMark(){
- bbGCMark( readyStateChanged );
- }
|