aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/connection.cpp21
-rw-r--r--src/httpget.cpp76
2 files changed, 70 insertions, 27 deletions
diff --git a/src/connection.cpp b/src/connection.cpp
index f042705..9d8b02c 100644
--- a/src/connection.cpp
+++ b/src/connection.cpp
@@ -11,6 +11,7 @@
11#include <netdb.h> 11#include <netdb.h>
12#include <arpa/inet.h> 12#include <arpa/inet.h>
13#include <errno.h> 13#include <errno.h>
14#include <fcntl.h>
14#include "exceptions.h" 15#include "exceptions.h"
15 16
16// Read buffer size...maybe fix wierd issues... 17// Read buffer size...maybe fix wierd issues...
@@ -137,10 +138,12 @@ bool Connection::isActive()
137 138
138void Connection::close() 139void Connection::close()
139{ 140{
141 //printf("Close called, socket is: %s\n", bActive?"Active":"Inactive" );
140 if( bActive ) 142 if( bActive )
141 { 143 {
142 fsync( nSocket ); 144 fsync( nSocket );
143 ::close( nSocket ); 145 ::close( nSocket );
146 //printf("Socket closed.\n");
144 } 147 }
145 bActive = false; 148 bActive = false;
146 //nSocket = -1; 149 //nSocket = -1;
@@ -175,8 +178,18 @@ bool Connection::open( const char *sAddr, int nPort )
175 bActive = false; 178 bActive = false;
176 return false; 179 return false;
177 } 180 }
181
182 // These lines set the socket to non-blocking, a good thing?
183 int flags;
184 flags = fcntl(nSocket, F_GETFL, 0);
185 flags |= O_NONBLOCK;
186 if (fcntl(nSocket, F_SETFL, flags) < 0)
187 {
188 return false;
189 }
178 190
179 /* Connect to the server. */ 191 /* Connect to the server. */
192 //printf("Resolving hostname (%s)...\n", sAddr );
180 { 193 {
181 struct hostent *hostinfo; 194 struct hostent *hostinfo;
182 195
@@ -190,16 +203,20 @@ bool Connection::open( const char *sAddr, int nPort )
190 xServerName.sin_addr = *(struct in_addr *) hostinfo->h_addr; 203 xServerName.sin_addr = *(struct in_addr *) hostinfo->h_addr;
191 } 204 }
192 205
206 //printf("Making actual connection...");
207 fflush( stdout );
193 int ret = connect( 208 int ret = connect(
194 nSocket, 209 nSocket,
195 (struct sockaddr *)&xServerName, 210 (struct sockaddr *)&xServerName,
196 sizeof(xServerName) 211 sizeof(xServerName)
197 ); 212 );
213 //printf("Connected.\n");
198 214
215 /*
199 if( ret < 0 ) 216 if( ret < 0 )
200 { 217 {
201 return false; 218 return false;
202 } 219 }*/
203 220
204 bActive = true; 221 bActive = true;
205 bDisconnectMe = false; 222 bDisconnectMe = false;
@@ -220,7 +237,7 @@ int Connection::readInput()
220 nbytes = read( nSocket, buffer, RBS ); 237 nbytes = read( nSocket, buffer, RBS );
221 if( nbytes < 0 && errno != 0 && errno != EAGAIN ) 238 if( nbytes < 0 && errno != 0 && errno != EAGAIN )
222 { 239 {
223 printf("errno: %d, %s\n", errno, strerror( errno ) ); 240 //printf("errno: %d, %s\n", errno, strerror( errno ) );
224 /* Read error. */ 241 /* Read error. */
225 //perror("readInput"); 242 //perror("readInput");
226 throw ConnectionException( excodeReadError, "Read error: %s", strerror( errno ) ); 243 throw ConnectionException( excodeReadError, "Read error: %s", strerror( errno ) );
diff --git a/src/httpget.cpp b/src/httpget.cpp
index 529d814..ee1f29c 100644
--- a/src/httpget.cpp
+++ b/src/httpget.cpp
@@ -156,8 +156,8 @@ SBuffer *HttpGet::get()
156 //printf("Connection content:\n\n%s\n\n", sData.c_str() ); 156 //printf("Connection content:\n\n%s\n\n", sData.c_str() );
157 157
158 Connection con; 158 Connection con;
159 //printf("Opening connection...\n");
159 con.open( sHost.c_str(), nPort ); 160 con.open( sHost.c_str(), nPort );
160 //printf("Connected, sending request.\n");
161 { 161 {
162 int nSocket = con.getSocket(); 162 int nSocket = con.getSocket();
163 fd_set rfds, wfds, efds; 163 fd_set rfds, wfds, efds;
@@ -170,50 +170,74 @@ SBuffer *HttpGet::get()
170 FD_ZERO(&efds); 170 FD_ZERO(&efds);
171 FD_SET(nSocket, &efds); 171 FD_SET(nSocket, &efds);
172 172
173 retval = select( nSocket+1, &rfds, &wfds, &efds, NULL ); 173 struct timeval tv;
174 printf("About to write: sock=%d, r=%d, w=%d, e=%d, ret=%d\n", 174 tv.tv_sec = 4;
175 tv.tv_usec = 0;
176
177 //printf("Selecting on socket, can we read, write, etc?\n");
178 retval = select( nSocket+1, &rfds, &wfds, &efds, &tv );
179 /*printf("About to write: sock=%d, r=%d, w=%d, e=%d, ret=%d\n",
175 nSocket, 180 nSocket,
176 FD_ISSET( nSocket, &rfds ), 181 FD_ISSET( nSocket, &rfds ),
177 FD_ISSET( nSocket, &wfds ), 182 FD_ISSET( nSocket, &wfds ),
178 FD_ISSET( nSocket, &efds ), 183 FD_ISSET( nSocket, &efds ),
179 retval 184 retval
180 ); 185 );*/
186
187 if( retval == 0 )
188 {
189 //printf("Timeout on connection.\n");
190 con.close();
191 throw ExceptionBase("Connection Timeout on open.\n");
192 }
181 193
182 } 194 }
183 con.appendOutput( sData.c_str(), sData.size() ); 195 con.appendOutput( sData.c_str(), sData.size() );
196 //printf("Writing to socket...\n");
184 con.writeOutput(); 197 con.writeOutput();
198 //printf("Data written...\n");
185 int nSec = 5; 199 int nSec = 5;
186 int nUSec = 0; 200 int nUSec = 0;
187 int nLastAmnt = con.getInputAmnt(); 201 int nLastAmnt = con.getInputAmnt();
188 try 202 try
189 { 203 {
190 double dTotTime = 0.0; 204 double dTotTime = 0.0;
191 while( con.readInput( nSec, nUSec, &nSec, &nUSec ) ) 205 //printf("About to read input...\n");
192 { 206 while( con.readInput( nSec, nUSec, &nSec, &nUSec ) )
193 if( nLastAmnt == con.getInputAmnt() )
194 {
195 if( nSec <= 0 && nUSec <= 0 )
196 throw ExceptionBase("Connection Timeout.\n");
197 if( nSec == 5 && nUSec == 0 )
198 break;
199 }
200 else
201 { 207 {
202 dTotTime += (5.0-(nSec+nUSec/1000000.0)); 208 if( nLastAmnt == con.getInputAmnt() )
203 printf("\rRead %db at %.2fkb/sec", 209 {
204 con.getInputAmnt(), 210 if( nSec <= 0 && nUSec <= 0 )
205 ((double)(con.getInputAmnt())/1024.0) / dTotTime 211 {
206 ); 212 //printf("out of time, closing up.\n");
207 fflush( stdout ); 213 con.close();
208 nSec = 5; 214 throw ExceptionBase("Connection Timeout.\n");
209 nUSec = 0; 215 }
210 nLastAmnt = con.getInputAmnt(); 216 if( nSec == 5 && nUSec == 0 )
217 {
218 //printf("No new data, breaking.\n");
219 break;
220 }
221 }
222 else
223 {
224 dTotTime += (5.0-(nSec+nUSec/1000000.0));
225 printf("\rRead %db at %.2fkb/sec",
226 con.getInputAmnt(),
227 ((double)(con.getInputAmnt())/1024.0) / dTotTime
228 );
229 fflush( stdout );
230 nSec = 5;
231 nUSec = 0;
232 nLastAmnt = con.getInputAmnt();
233 }
211 } 234 }
212 } 235 }
213 }
214 catch( ConnectionException &e ) 236 catch( ConnectionException &e )
215 { 237 {
216 printf("ConnectionException: %s\n", e.what() ); 238 //con.close();
239 if( strcmp( e.what(), "Connection closed" ) )
240 printf("\nConnectionException: %s\n", e.what() );
217 } 241 }
218 242
219 int total = con.getInputAmnt(); 243 int total = con.getInputAmnt();
@@ -232,6 +256,8 @@ SBuffer *HttpGet::get()
232 } 256 }
233 con.close(); 257 con.close();
234 258
259 //printf("\n\n%s\n\n", dat );
260
235 throw ExceptionBase("Something went wrong, incomplete response? fix this.\n"); 261 throw ExceptionBase("Something went wrong, incomplete response? fix this.\n");
236} 262}
237 263