0

I am trying to build a browser using Python+pygtk+webkit. Now, I want to throttle the speed of connection (i.e) time to load a web page or download speed..mainly http..

So, is there any protocol or webkit method i can use for the same. Below is my browser code. Thankx in advance!!

import webkit
import gobject

class Browser:
    default_site = "http://stackoverflow.com/"

    def delete_event(self, widget, event, data=None):
        return False

    def destroy(self, widget, data=None):
        gtk.main_quit()

    def __init__(self):
        gobject.threads_init()
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_resizable(True)
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)

        #webkit.WebView allows us to embed a webkit browser
        #it takes care of going backwards/fowards/reloading
        #it even handles flash
        self.web_view = webkit.WebView()
        self.web_view.open(self.default_site)

        toolbar = gtk.Toolbar()

        #create the back button and connect the action to
        #allow us to go backwards using webkit
        self.back_button = gtk.ToolButton(gtk.STOCK_GO_BACK)
        self.back_button.connect("clicked", self.go_back)

        #same idea for forward button
        self.forward_button = gtk.ToolButton(gtk.STOCK_GO_FORWARD)
        self.forward_button.connect("clicked", self.go_forward)

        #again for refresh
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
        refresh_button.connect("clicked", self.refresh)

        #add the buttons to the toolbar
        toolbar.add(self.back_button)
        toolbar.add(self.forward_button)
        toolbar.add(refresh_button)

        #entry bar for typing in and display URLs, when they type in a site
        #and hit enter the on_active function is called
        self.url_bar = gtk.Entry()
        self.url_bar.connect("activate", self.on_active)

        #anytime a site is loaded the update_buttons will be called
        self.web_view.connect("load_committed", self.update_buttons)

        scroll_window = gtk.ScrolledWindow(None, None)
        scroll_window.add(self.web_view)


        vbox = gtk.VBox(False, 0)
        vbox.pack_start(toolbar, False, True, 0)
        vbox.pack_start(self.url_bar, False, True, 0)
        vbox.add(scroll_window)

        self.window.add(vbox)
        self.window.show_all()

    def on_active(self, widge, data=None):
        '''When the user enters an address in the bar, we check to make
           sure they added the http://, if not we add it for them.  Once
           the url is correct, we just ask webkit to open that site.'''
        url = self.url_bar.get_text()
        try:
            url.index("://")
        except:
            url = "http://"+url
        self.url_bar.set_text(url)
        self.web_view.open(url)

    def go_back(self, widget, data=None):
        '''Webkit will remember the links and this will allow us to go
           backwards.'''
        self.web_view.go_back()

    def go_forward(self, widget, data=None):
        '''Webkit will remember the links and this will allow us to go
           forwards.'''
        self.web_view.go_forward()

    def refresh(self, widget, data=None):
        '''Simple makes webkit reload the current back.'''
        self.web_view.reload()

    def update_buttons(self, widget, data=None):
        '''Gets the current url entry and puts that into the url bar.
           It then checks to see if we can go back, if we can it makes the
           back button clickable.  Then it does the same for the foward
           button.'''
        #self.url_bar.set_text( widget.get_main_frame().get_uri() )
        url = str(widget.get_main_frame().get_uri())
        print url
        if (url == "http://www.facebook.com/"):
            self.__go("age_error.html")
        else:    
            self.url_bar.set_text( widget.get_main_frame().get_uri() )
            print  widget.get_main_frame().get_uri() 
            self.back_button.set_sensitive(self.web_view.can_go_back())
            self.forward_button.set_sensitive(self.web_view.can_go_forward())

    def main(self):
        gtk.main()

if __name__ == "__main__":
    browser = Browser()

    browser.main()
Mike Pennington
  • 41,899
  • 19
  • 136
  • 174
java_doctor_101
  • 3,287
  • 4
  • 46
  • 78

1 Answers1

1

If there's a way to use your own transmit/receive code, you could implement it as a read()+sleep(). For example, Let's say you want it to use '50% bandwidth', you would time your read(), then sleep for just as long.

chmeee
  • 3,608
  • 1
  • 21
  • 28
  • I agree with you that time.sleep() can help me in delaying the loading of a site, but what I really want is to throttle the connection speed. What I am really trying to do is to make a browser for a cyber cafe who will provide slow connection for less money. With time.sleep() function I can't save the bandwidth because if customer watch a video on youtube with time.sleep(10) may be it will start after 10 second, but after 10 seconds it will buffer again with the same initial speed. Hope you got my point.. – java_doctor_101 May 03 '12 at 18:46
  • Well, in my answer, I meant it more for reading smaller data, so the delays would be in fractions of seconds. Read 1kB, sleep for 100ms. The only other way I could think would be to handle it in the OS layer, with Linux you could use iptables, with FreeBSD you could use ipfw or pf, with QoS. But from your initial question it appeared you wanted a purely user-level solution, which would be small reads with small sleeps. – chmeee May 03 '12 at 19:14
  • can you please be a little more code specific.. os layer is not an option since I have to myself alter some protocols, I was hoping to find some webkit methods to throttle the speed..since it's a web engine so it must be working on some http protocols to transfer the data..so now the question is how can i change that particular method (if it is there).. – java_doctor_101 May 03 '12 at 19:19
  • After taking a closer look at the webkit-gtk2 API headers, it appears that doing this is not possible, as the API does not have socket delegates. – chmeee May 03 '12 at 19:43