47#define M_PRINTF(format, args...) \
48 printf("PS2HTTP: " format, ##args)
51#define M_DEBUG M_PRINTF
53#define M_DEBUG(format, args...)
56#define MODNAME "ps2http"
69char strTest[] =
"GET /blah HTTP/1.0\n\n";
71char HTTPGET[] =
"GET ";
72char HTTPHOST[] =
"Host: ";
73char HTTPGETEND[] =
" HTTP/1.0\r\n";
74char HTTPUSERAGENT[] =
"User-Agent: PS2IP HTTP Client\r\n";
75char HTTPENDHEADER[] =
"\r\n";
80int parseContentLength(
char *mimeBuffer)
84 line = strstr(mimeBuffer,
"CONTENT-LENGTH:");
85 line += strlen(
"CONTENT-LENGTH:");
88 while((*line ==
' ') || (*line ==
'\t')) line++;
90 return (
int)strtol(line,NULL, 10);
97int isErrorHeader(
char *mimeBuffer)
103 line = strstr(mimeBuffer,
"HTTP/1.");
104 line += strlen(
"HTTP/1.");
110 while((*line ==
' ') || (*line ==
'\t')) line++;
113 for(i = 0; ((line[i] !=
' ') && (line[i] !=
'\t')); i++);
116 code = (int)strtol(line,NULL, 10);
128int readLine(
int socket,
char * buffer,
int size )
135 while (
count < size )
139 rc = recv( socket, ptr, 1, 0 );
141 if ( rc <= 0 )
return rc;
143 if ( (*ptr ==
'\n') )
break;
168 char mimeBuffer[100];
170 M_DEBUG(
"create socket\n" );
172 if((sockHandle = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0)
174 M_PRINTF(
"SOCKET FAILED\n" );
178 M_DEBUG(
"connect\n" );
180 rc = connect( sockHandle, (
struct sockaddr *) server,
sizeof(*server));
183 M_PRINTF(
"CONNECT FAILED %i\n", sockHandle );
186 peerHandle = sockHandle;
190 rc = send( peerHandle, HTTPGET,
sizeof( HTTPGET ) - 1, 0 );
191 if (rc < 0)
goto fail_send;
192 rc = send( peerHandle, (
void*) url, strlen( url ), 0 );
193 if (rc < 0)
goto fail_send;
194 rc = send( peerHandle, HTTPGETEND,
sizeof( HTTPGETEND ) - 1, 0 );
195 if (rc < 0)
goto fail_send;
197 rc = send( peerHandle, HTTPHOST,
sizeof( HTTPHOST ) - 1, 0 );
198 if (rc < 0)
goto fail_send;
199 rc = send( peerHandle, hostAddr, strlen( hostAddr ), 0 );
200 if (rc < 0)
goto fail_send;
201 rc = send( peerHandle, HTTPENDHEADER,
sizeof( HTTPENDHEADER ) - 1, 0 );
202 if (rc < 0)
goto fail_send;
204 rc = send( peerHandle, HTTPUSERAGENT,
sizeof( HTTPUSERAGENT ) - 1, 0 );
205 if (rc < 0)
goto fail_send;
206 rc = send( peerHandle, HTTPENDHEADER,
sizeof( HTTPENDHEADER ) - 1, 0 );
207 if (rc < 0)
goto fail_send;
215 rc = readLine( peerHandle, mimeBuffer, 100 );
217 M_DEBUG(
">> %s", mimeBuffer);
219 if ( rc < 0 )
return rc;
222 if ( rc == 0 )
break;
223 if ( (rc == 1) && (mimeBuffer[0] ==
'\r') )
break;
226 for(i = 0; (
unsigned int)i < strlen(mimeBuffer); i++)
227 mimeBuffer[i] = toupper(mimeBuffer[i]);
229 if(strstr(mimeBuffer,
"HTTP/1."))
230 if((rc = isErrorHeader(mimeBuffer))) {
231 M_PRINTF(
"status code = %d!\n", rc);
235 if(strstr(mimeBuffer,
"CONTENT-LENGTH:"))
237 pHandle->fileSize = parseContentLength(mimeBuffer);
238 M_DEBUG(
"fileSize = %d\n", pHandle->fileSize);
247 printf(
"HTTP: SEND FAILED %i\n", peerHandle );
251char *strnchr(
char *str,
char ch,
int max) {
254 for(i = 0; (i < max) && (str[i] !=
'\0'); i++)
261static int _ResolveHostname(
const char *hostname ,
struct in_addr* ip)
266 if((HostEntry = gethostbyname(hostname)) == NULL)
269 for(addr_list = (
struct in_addr **) HostEntry->h_addr_list; addr_list != NULL; addr_list++)
271 ip->s_addr = (*addr_list)->s_addr;
289const char *resolveAddress(
struct sockaddr_in *server,
const char * url,
char *hostAddr )
292 const char *char_ptr;
303 while(url[0] ==
'/') {
307 for(i = 0; ((url[i] !=
'\0') && (url[i] !=
'/')) && (i < 127); i++)
308 if((((addr[i] = url[i]) <
'0') || (url[i] >
'9')) && (url[i] !=
'.')) {
311 for(w = 0; ((w + i + 1) < 127) && (w < 5) && (url[w + i + 1] !=
'/') && (url[w + i + 1] !=
'\0'); w++)
312 port[w] = url[w + i + 1];
315 M_DEBUG(
"using port %s for connection\n", port);
322 strcpy(hostAddr, addr);
326 rv = _ResolveHostname(addr, &server->sin_addr);
328 M_PRINTF(
"failed to resolve domain '%s'\n", addr);
333 server->sin_addr.s_addr = inet_addr(addr);
336 i = (int) strtol(port, NULL, 10);
337 server->sin_port = htons(i);
339 server->sin_family = AF_INET;
343 while(*char_ptr !=
'/') char_ptr++;
370 M_DEBUG(
"httpOpen(-, %s, %d)\n", name, mode);
372 if((privData = AllocSysMemory(ALLOC_FIRST,
sizeof(
t_fioPrivData), NULL)) == NULL)
377 privData->fileSize = 0;
378 privData->filePos = 0;
380 memset(&server, 0,
sizeof(server));
382 if((getName = resolveAddress( &server, name, hostAddr )) == NULL)
384 FreeSysMemory(privData);
390 if((peerHandle = httpConnect( &server, hostAddr, getName, privData )) < 0)
392 M_PRINTF(
"failed to connect to '%s'!\n", hostAddr);
393 FreeSysMemory(privData);
398 privData->sockFd = peerHandle;
415 M_DEBUG(
"httpRead(-, 0x%X, %d)\n", (
int)buffer, size);
421 int bytesRead = recv( privData->sockFd, (
void *)((u8 *)buffer + totalRead), left, 0 );
425 if(bytesRead <= 0)
break;
428 totalRead += bytesRead;
444 M_DEBUG(
"httpClose(-)\n");
446 lwip_close(privData->sockFd);
447 FreeSysMemory(privData);
461 M_DEBUG(
"httpLseek(-, %d, %d)\n", (
int)offset, mode);
466 privData->filePos = offset;
470 privData->filePos += offset;
474 privData->filePos = privData->fileSize + offset;
481 return privData->filePos;
484IOMAN_RETURN_VALUE_IMPL(0);
485IOMAN_RETURN_VALUE_IMPL(
EIO);
488 IOMAN_RETURN_VALUE(0),
489 IOMAN_RETURN_VALUE(0),
490 IOMAN_RETURN_VALUE(
EIO),
494 IOMAN_RETURN_VALUE(
EIO),
496 IOMAN_RETURN_VALUE(
EIO),
497 IOMAN_RETURN_VALUE(
EIO),
498 IOMAN_RETURN_VALUE(
EIO),
499 IOMAN_RETURN_VALUE(
EIO),
500 IOMAN_RETURN_VALUE(
EIO),
501 IOMAN_RETURN_VALUE(
EIO),
502 IOMAN_RETURN_VALUE(
EIO),
503 IOMAN_RETURN_VALUE(
EIO),
504 IOMAN_RETURN_VALUE(
EIO),
511 "HTTP client file driver",
519int _start(
int argc,
char *argv[])
524 M_PRINTF(
"Module Loaded\n");
526 M_PRINTF(
"Adding 'http' driver into io system\n");
528 io_AddDrv(&ps2httpDev);
530 return MODULE_RESIDENT_END;
u32 count
start sector of fragmented bd/file