Brandon
2013-01-03 00:59:57
I've been messing with Simba's untouched functions and API's lately and decided to mess around with Sockets to Send and Receive Emails, Download Pages and Files. Literally almost everything. Only thing I haven't tried yet is SQL connections.. Also only some emails seem to work.. Something to do with SSL..
Here's some Snippets you guys can use/run.. The following can read from a socket one line at a time or all at once, all the headers, chunk encoded data and any data given the right headers. The example code will download a PNG file I randomly chose from Imgur to your Simba folder..
If you want, you can also PacketSniff with it given the right information and requests. You can also set your own User-Agent and Referral site as well. It's pretty fast. Took only 27ms to run the code on my crappy internet.
Iunno where the Snippets section is or what section this would go in but meh..
Here's some Snippets you guys can use/run.. The following can read from a socket one line at a time or all at once, all the headers, chunk encoded data and any data given the right headers. The example code will download a PNG file I randomly chose from Imgur to your Simba folder..
If you want, you can also PacketSniff with it given the right information and requests. You can also set your own User-Agent and Referral site as well. It's pretty fast. Took only 27ms to run the code on my crappy internet.
Iunno where the Snippets section is or what section this would go in but meh..
Function RecvLine(Socket: Integer): String;
var
Character, Line: String;
Begin
While(True) Do
Begin
Character := RecvSocketEx(Socket, 1);
If (Character = #13) Then
Begin
Character := RecvSocketEx(Socket, 1);
If (Character = #10) Then Break;
Line := Line + #13;
End Else
If (Character = #10) Then Break;
Line := Line + Character;
End;
Result := Line;
End;
Function RecvHeader(Socket: Integer): TStringArray;
var
I: Integer;
Line: String;
Begin
While(True) Do
Begin
Line := RecvLine(Socket);
If (Length(Line) = 0) Then Exit;
SetLength(Result, Length(Result) + 1);
Result[I] := Line;
Inc(I);
End;
End;
Function FindHeaderValue(LineToFind: String; Header: TStringArray): String;
var
I, H, Position: Integer;
Begin
H := High(Header);
For I := 0 To H Do
Begin
Position := Pos(':', Header[I]);
If ((Position > 0) And (Copy(Header[I], 0, Position - 1) = LineToFind)) Then
Begin
Position := Pos(' ', Header[I]);
If (Position <> 0) Then
Begin
Result := Copy(Header[I], Position + 1, Length(Header[I]) - Position);
Exit;
End;
End;
End;
End;
Function RecvChunkSize(Socket: Integer): Integer;
var
Line: String;
Position: Integer;
Begin
Line := RecvSocketStr(Socket);
Position := Pos(';', Line);
If (Position <> 0) Then
Delete(Line, Position, 1);
Result := HexToInt(Line);
End;
Function GetPageSocket(WebPage, Port: String): String;
var
Header: TStringArray;
Socket, ChunkLength: Integer;
Request, Encoding, Data, Buffer: String;
Begin
WebPage := Replace(WebPage, 'http://', '', [rfIgnoreCase, rfReplaceAll]);
WebPage := Replace(WebPage, 'https://', '', [rfIgnoreCase, rfReplaceAll]);
Request := 'GET / HTTP/1.1' + #13#10;
Request := Request + 'Host: ' + WebPage + #13#10;
Request := Request + 'Connection: close' + #13#10;
Request := Request + 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11' + #13#10;
Request := Request + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + #13#10;
Request := Request + 'Accept-Language: en-US,en;q=0.8' + #13#10;
Request := Request + 'Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7' + #13#10;
Request := Request + 'Cache-Control: no-cache' + #13#10;
Request := Request + #13#10;
Socket := CreateSocket;
ConnectSocket(Socket, WebPage, Port);
SendSocket(Socket, Request);
Header := RecvHeader(Socket);
Encoding := FindHeaderValue('Transfer-Encoding', Header);
If (Encoding = 'chunked') Then
Begin
ChunkLength := RecvChunkSize(Socket);
While(ChunkLength <> 0) Do
Begin
Data := Data + RecvSocketEx(Socket, ChunkLength);
RecvLine(Socket);
ChunkLength := RecvChunkSize(Socket);
End;
End Else
Begin
Encoding := FindHeaderValue('Content-Length', Header);
If (Length(Encoding) > 0) Then
Begin
ChunkLength := StrToIntDef(Encoding, -1);
If (ChunkLength > 0) Then
Data := RecvSocketEx(Socket, ChunkLength);
End Else
Begin
While(True) Do
Begin
Buffer := RecvSocketEx(Socket, 1024);
If (Length(Buffer) = 0) Then Break;
Data := Data + Copy(Buffer, 0, Length(Buffer));
End;
End;
End;
CloseSocket(Socket);
FreeSocket(Socket);
Result := Data;
End;
Function DownloadFile(WebPage, Port, SaveAsPath: String): Boolean;
var
Header: TStringArray;
FileDownloaded: Integer;
Socket, Position, ChunkLength: Integer;
Host, FileLocation, Request, Encoding, Buffer, Data: String;
Begin
WebPage := Replace(WebPage, 'http://', '', [rfIgnoreCase, rfReplaceAll]);
WebPage := Replace(WebPage, 'https://', '', [rfIgnoreCase, rfReplaceAll]);
If (ExtractFileExt(WebPage) <> ExtractFileExt(SaveAsPath)) Then Exit;
Position := Pos('/', WebPage);
If (Position = 0) Then Exit;
Host := Copy(WebPage, 0, Position - 1);
FileLocation := Copy(WebPage, Position + 1, Length(WebPage) - Position);
Request := 'GET /' + FileLocation + ' HTTP/1.1' + #13#10;
Request := Request + 'Host: ' + Host + #13#10;
Request := Request + 'Connection: close' + #13#10;
Request := Request + 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11' + #13#10;
Request := Request + 'Cache-Control: no-cache' + #13#10;
Request := Request + #13#10;
Socket := CreateSocket;
ConnectSocket(Socket, Host, Port);
SendSocket(Socket, Request);
Header := RecvHeader(Socket);
Encoding := FindHeaderValue('Content-Length', Header);
If (Encoding = 'chunked') Then
Begin
ChunkLength := RecvChunkSize(Socket);
While(ChunkLength <> 0) Do
Begin
Data := Data + RecvSocketEx(Socket, ChunkLength);
RecvLine(Socket);
ChunkLength := RecvChunkSize(Socket);
End;
End Else
Begin
Encoding := FindHeaderValue('Content-Length', Header);
If (Length(Encoding) > 0) Then
Begin
ChunkLength := StrToIntDef(Encoding, -1);
If (ChunkLength > 0) Then
Data := RecvSocketEx(Socket, ChunkLength);
End Else
Begin
While(True) Do
Begin
Buffer := RecvSocketEx(Socket, 1024);
If (Length(Buffer) = 0) Then Break;
Data := Data + Copy(Buffer, 0, Length(Buffer));
End;
End;
End;
CloseSocket(Socket);
FreeSocket(Socket);
FileDownloaded := CreateFile(SaveAsPath);
If (FileDownloaded <> -1) Then
Begin
WriteFileString(FileDownloaded, Data);
CloseFile(FileDownloaded);
Result := True;
End;
End;
begin
DownloadFile('http://i.imgur.com/AgLG0.png', '80', 'Foo.png');
end.